diff options
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 12 | ||||
-rw-r--r-- | lib/Sema/TreeTransform.h | 31 |
3 files changed, 25 insertions, 20 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 449c5f3384..cab807b999 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -1457,7 +1457,7 @@ static DeclRefExpr* EvalVal(Expr *E) { // Accesses to members are potential references to data on the stack. case Stmt::MemberExprClass: - case Stmt::CXXQualifiedMemberExprClass: { + case Stmt::CXXAdornedMemberExprClass: { MemberExpr *M = cast<MemberExpr>(E); // Check for indirect access. We only want direct field accesses. diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 026ff43d2d..7f680f5d2f 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -878,15 +878,15 @@ Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) { return false; } -/// \brief Build a MemberExpr or CXXQualifiedMemberExpr, as appropriate. +/// \brief Build a MemberExpr or CXXAdornedMemberExpr, as appropriate. static MemberExpr *BuildMemberExpr(ASTContext &C, Expr *Base, bool isArrow, const CXXScopeSpec *SS, NamedDecl *Member, SourceLocation Loc, QualType Ty) { if (SS && SS->isSet()) - return new (C) CXXQualifiedMemberExpr(Base, isArrow, - (NestedNameSpecifier *)SS->getScopeRep(), - SS->getRange(), - Member, Loc, Ty); + return new (C) CXXAdornedMemberExpr(Base, isArrow, + (NestedNameSpecifier *)SS->getScopeRep(), + SS->getRange(), + Member, Loc, Ty); return new (C) MemberExpr(Base, isArrow, Member, Loc, Ty); } @@ -4837,7 +4837,7 @@ static NamedDecl *getPrimaryDecl(Expr *E) { case Stmt::QualifiedDeclRefExprClass: return cast<DeclRefExpr>(E)->getDecl(); case Stmt::MemberExprClass: - case Stmt::CXXQualifiedMemberExprClass: + case Stmt::CXXAdornedMemberExprClass: // If this is an arrow operator, the address is an offset from // the base's value, so the object the base refers to is // irrelevant. diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index deb54115a5..8cb57d904f 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -1425,16 +1425,18 @@ public: /// /// By default, performs semantic analysis to build the new expression. /// Subclasses may override this routine to provide different behavior. - OwningExprResult RebuildCXXQualifiedMemberExpr(ExprArg Base, - SourceLocation OpLoc, - bool isArrow, - NestedNameSpecifier *Qualifier, - SourceRange QualifierRange, - SourceLocation MemberLoc, - NamedDecl *Member) { + OwningExprResult RebuildCXXAdornedMemberExpr(ExprArg Base, + SourceLocation OpLoc, + bool isArrow, + NestedNameSpecifier *Qualifier, + SourceRange QualifierRange, + SourceLocation MemberLoc, + NamedDecl *Member) { CXXScopeSpec SS; - SS.setRange(QualifierRange); - SS.setScopeRep(Qualifier); + if (Qualifier) { + SS.setRange(QualifierRange); + SS.setScopeRep(Qualifier); + } return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, isArrow? tok::arrow : tok::period, MemberLoc, @@ -1588,6 +1590,9 @@ template<typename Derived> NestedNameSpecifier * TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, SourceRange Range) { + if (!NNS) + return 0; + // Transform the prefix of this nested name specifier. NestedNameSpecifier *Prefix = NNS->getPrefix(); if (Prefix) { @@ -4014,8 +4019,8 @@ TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( template<typename Derived> Sema::OwningExprResult -TreeTransform<Derived>::TransformCXXQualifiedMemberExpr( - CXXQualifiedMemberExpr *E) { +TreeTransform<Derived>::TransformCXXAdornedMemberExpr( + CXXAdornedMemberExpr *E) { OwningExprResult Base = getDerived().TransformExpr(E->getBase()); if (Base.isInvalid()) return SemaRef.ExprError(); @@ -4028,7 +4033,7 @@ TreeTransform<Derived>::TransformCXXQualifiedMemberExpr( NestedNameSpecifier *Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), E->getQualifierRange()); - if (Qualifier == 0) + if (Qualifier == 0 && E->getQualifier() != 0) return SemaRef.ExprError(); if (!getDerived().AlwaysRebuild() && @@ -4041,7 +4046,7 @@ TreeTransform<Derived>::TransformCXXQualifiedMemberExpr( SourceLocation FakeOperatorLoc = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); - return getDerived().RebuildCXXQualifiedMemberExpr(move(Base), + return getDerived().RebuildCXXAdornedMemberExpr(move(Base), FakeOperatorLoc, E->isArrow(), Qualifier, |