diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-08-26 19:22:42 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-08-26 19:22:42 +0000 |
| commit | c24fc2949ebee5ada78f031780fab66fbf3eb4a2 (patch) | |
| tree | 5dd663926d47506dcf3e2f1e6d6c9ff77ace705a /clang/lib | |
| parent | bdabe5e5ea21297abb38d126640ddd13493bef45 (diff) | |
| download | bcm5719-llvm-c24fc2949ebee5ada78f031780fab66fbf3eb4a2.tar.gz bcm5719-llvm-c24fc2949ebee5ada78f031780fab66fbf3eb4a2.zip | |
More support for pseudo dtors.
llvm-svn: 80129
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 35 |
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) { |

