diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-02-24 23:40:28 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-02-24 23:40:28 +0000 |
commit | 26d4ac97fb514bb60c2536eae6f203dc569159d9 (patch) | |
tree | 7d755fcdcb040ccfc58dad37b399dba8b25437cb /lib/Sema/SemaExprCXX.cpp | |
parent | 396a9f235e160093b5f803f7a6a18fad7b68bdbe (diff) |
Retain complete source information for the type after the '~' in a
CXXPseudoDestructorExpr.
Update template instantiation for pseudo-destructor expressions to use
this source information and to make use of
Sema::BuildPseudoDestructorExpr when the base expression is dependent
or refers to a scalar type.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97079 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index ef0ad6f8b1..98e8000b17 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -2431,11 +2431,11 @@ Sema::OwningExprResult Sema::BuildPseudoDestructorExpr(ExprArg Base, SourceLocation OpLoc, tok::TokenKind OpKind, const CXXScopeSpec &SS, - TypeSourceInfo *ScopeTypeInfo, + TypeSourceInfo *ScopeTypeInfo, SourceLocation CCLoc, - TypeSourceInfo *DestructedTypeLoc, + TypeSourceInfo *DestructedTypeInfo, bool HasTrailingLParen) { - assert(DestructedTypeLoc && "No destructed type in pseudo-destructor expr?"); + assert(DestructedTypeInfo && "No destructed type in pseudo-destructor expr?"); // C++ [expr.pseudo]p2: // The left-hand side of the dot operator shall be of scalar type. The @@ -2467,18 +2467,18 @@ Sema::OwningExprResult Sema::BuildPseudoDestructorExpr(ExprArg Base, // C++ [expr.pseudo]p2: // [...] The cv-unqualified versions of the object type and of the type // designated by the pseudo-destructor-name shall be the same type. - QualType DestructedType = DestructedTypeLoc->getType(); + QualType DestructedType = DestructedTypeInfo->getType(); SourceLocation DestructedTypeStart - = DestructedTypeLoc->getTypeLoc().getSourceRange().getBegin(); + = DestructedTypeInfo->getTypeLoc().getSourceRange().getBegin(); if (!DestructedType->isDependentType() && !ObjectType->isDependentType() && !Context.hasSameUnqualifiedType(DestructedType, ObjectType)) { Diag(DestructedTypeStart, diag::err_pseudo_dtor_type_mismatch) << ObjectType << DestructedType << BaseE->getSourceRange() - << DestructedTypeLoc->getTypeLoc().getSourceRange(); + << DestructedTypeInfo->getTypeLoc().getSourceRange(); // Recover by DestructedType = ObjectType; - DestructedTypeLoc = Context.getTrivialTypeSourceInfo(ObjectType, + DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType, DestructedTypeStart); } @@ -2513,13 +2513,12 @@ Sema::OwningExprResult Sema::BuildPseudoDestructorExpr(ExprArg Base, SS.getRange(), ScopeTypeInfo, CCLoc, - DestructedType, - DestructedTypeStart)); + DestructedTypeInfo)); if (HasTrailingLParen) return move(Result); return DiagnoseDtorReference( - DestructedTypeLoc->getTypeLoc().getSourceRange().getBegin(), + DestructedTypeInfo->getTypeLoc().getSourceRange().getBegin(), move(Result)); } |