summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExprCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-08-26 19:22:42 +0000
committerAnders Carlsson <andersca@mac.com>2009-08-26 19:22:42 +0000
commitc24fc2949ebee5ada78f031780fab66fbf3eb4a2 (patch)
tree5dd663926d47506dcf3e2f1e6d6c9ff77ace705a /clang/lib/Sema/SemaExprCXX.cpp
parentbdabe5e5ea21297abb38d126640ddd13493bef45 (diff)
downloadbcm5719-llvm-c24fc2949ebee5ada78f031780fab66fbf3eb4a2.tar.gz
bcm5719-llvm-c24fc2949ebee5ada78f031780fab66fbf3eb4a2.zip
More support for pseudo dtors.
llvm-svn: 80129
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp35
1 files changed, 26 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index cf52bae86ca..2b0749aec02 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -1694,18 +1694,35 @@ Sema::ActOnDestructorReferenceExpr(Scope *S, ExprArg Base,
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));
-
- Expr *BaseExpr = Base.takeAs<Expr>();
- assert(BaseExpr && "no record expression");
+ 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();
+ }
- // Perform default conversions.
- DefaultFunctionArrayConversion(BaseExpr);
+ QualType BaseType = GetTypeFromParser(BaseTy);
+ if (!BaseType->isRecordType()) {
+ Diag(ClassNameLoc, diag::err_type_in_pseudo_dtor_not_a_class_type)
+ << BaseType;
+ return ExprError();
+ }
- 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) {
OpenPOWER on IntegriCloud