More support for pseudo dtors.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80129 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index cf52bae..2b0749ae 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -1694,18 +1694,35 @@
                                    const CXXScopeSpec *SS) {
   if (SS && SS->isInvalid())
     return ExprError();
+
+  Expr *BaseExpr = (Expr *)Base.get();
   
-  // Since this might be a postfix expression, get rid of ParenListExprs.
-  Base = MaybeConvertParenListExprToParenExpr(S, move(Base));
+  if (BaseExpr->isTypeDependent() || 
+      (SS && isDependentScopeSpecifier(*SS))) {
+    // FIXME: Return an unresolved ref expr.
+    return ExprError();
+  }
+
+  TypeTy *BaseTy = getTypeName(*ClassName, ClassNameLoc, S, SS);
+  if (!BaseTy) {
+    Diag(ClassNameLoc, diag::err_ident_in_pseudo_dtor_not_a_type) 
+      << ClassName;
+    return ExprError();
+  }
   
-  Expr *BaseExpr = Base.takeAs<Expr>();
-  assert(BaseExpr && "no record expression");
+  QualType BaseType = GetTypeFromParser(BaseTy);
+  if (!BaseType->isRecordType()) {
+    Diag(ClassNameLoc, diag::err_type_in_pseudo_dtor_not_a_class_type)
+      << BaseType;
+    return ExprError();
+  }
   
-  // Perform default conversions.
-  DefaultFunctionArrayConversion(BaseExpr);
-  
-  QualType BaseType = BaseExpr->getType();
-  return ExprError();
+  CanQualType CanBaseType = Context.getCanonicalType(BaseType);
+  DeclarationName DtorName = 
+    Context.DeclarationNames.getCXXDestructorName(CanBaseType);
+
+  return BuildMemberReferenceExpr(S, move(Base), OpLoc, OpKind, ClassNameLoc,
+                                  DtorName, DeclPtrTy(), SS);
 }
 
 Sema::OwningExprResult Sema::ActOnFinishFullExpr(ExprArg Arg) {