diff options
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 88 |
3 files changed, 29 insertions, 72 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index cab807b999a..24eb8b1d5e0 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -1456,8 +1456,7 @@ static DeclRefExpr* EvalVal(Expr *E) { } // Accesses to members are potential references to data on the stack. - case Stmt::MemberExprClass: - case Stmt::CXXAdornedMemberExprClass: { + case Stmt::MemberExprClass: { MemberExpr *M = cast<MemberExpr>(E); // Check for indirect access. We only want direct field accesses. diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 7f680f5d2f4..df94f20af7d 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -878,15 +878,14 @@ Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) { return false; } -/// \brief Build a MemberExpr or CXXAdornedMemberExpr, as appropriate. +/// \brief Build a MemberExpr AST node. 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) CXXAdornedMemberExpr(Base, isArrow, - (NestedNameSpecifier *)SS->getScopeRep(), - SS->getRange(), - Member, Loc, Ty); + return MemberExpr::Create(C, Base, isArrow, + (NestedNameSpecifier *)SS->getScopeRep(), + SS->getRange(), Member, Loc, Ty); return new (C) MemberExpr(Base, isArrow, Member, Loc, Ty); } @@ -4837,7 +4836,6 @@ static NamedDecl *getPrimaryDecl(Expr *E) { case Stmt::QualifiedDeclRefExprClass: return cast<DeclRefExpr>(E)->getDecl(); case Stmt::MemberExprClass: - 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/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 8cb57d904fa..3879b39e6ec 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -835,13 +835,23 @@ public: /// By default, performs semantic analysis to build the new expression. /// Subclasses may override this routine to provide different behavior. OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, - bool isArrow, SourceLocation MemberLoc, + bool isArrow, + NestedNameSpecifier *Qualifier, + SourceRange QualifierRange, + SourceLocation MemberLoc, NamedDecl *Member) { + CXXScopeSpec SS; + if (Qualifier) { + SS.setRange(QualifierRange); + SS.setScopeRep(Qualifier); + } + return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, isArrow? tok::arrow : tok::period, MemberLoc, Member->getDeclName(), - /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); + /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), + &SS); } /// \brief Build a new binary operator expression. @@ -1421,30 +1431,6 @@ public: RParenLoc); } - /// \brief Build a new qualified member access expression. - /// - /// By default, performs semantic analysis to build the new expression. - /// Subclasses may override this routine to provide different behavior. - OwningExprResult RebuildCXXAdornedMemberExpr(ExprArg Base, - SourceLocation OpLoc, - bool isArrow, - NestedNameSpecifier *Qualifier, - SourceRange QualifierRange, - SourceLocation MemberLoc, - NamedDecl *Member) { - CXXScopeSpec SS; - if (Qualifier) { - SS.setRange(QualifierRange); - SS.setScopeRep(Qualifier); - } - return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, - isArrow? tok::arrow : tok::period, - MemberLoc, - Member->getDeclName(), - /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), - &SS); - } - /// \brief Build a new member reference expression. /// /// By default, performs semantic analysis to build the new expression. @@ -2973,6 +2959,15 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { if (Base.isInvalid()) return SemaRef.ExprError(); + NestedNameSpecifier *Qualifier = 0; + if (E->hasQualifier()) { + Qualifier + = getDerived().TransformNestedNameSpecifier(E->getQualifier(), + E->getQualifierRange()); + if (Qualifier == 0); + return SemaRef.ExprError(); + } + NamedDecl *Member = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); if (!Member) @@ -2980,6 +2975,7 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && + Qualifier == E->getQualifier() && Member == E->getMemberDecl()) return SemaRef.Owned(E->Retain()); @@ -2989,6 +2985,8 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, E->isArrow(), + Qualifier, + E->getQualifierRange(), E->getMemberLoc(), Member); } @@ -4016,45 +4014,7 @@ TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( FakeCommaLocs.data(), E->getRParenLoc()); } - -template<typename Derived> -Sema::OwningExprResult -TreeTransform<Derived>::TransformCXXAdornedMemberExpr( - CXXAdornedMemberExpr *E) { - OwningExprResult Base = getDerived().TransformExpr(E->getBase()); - if (Base.isInvalid()) - return SemaRef.ExprError(); - - NamedDecl *Member - = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); - if (!Member) - return SemaRef.ExprError(); - NestedNameSpecifier *Qualifier - = getDerived().TransformNestedNameSpecifier(E->getQualifier(), - E->getQualifierRange()); - if (Qualifier == 0 && E->getQualifier() != 0) - return SemaRef.ExprError(); - - if (!getDerived().AlwaysRebuild() && - Base.get() == E->getBase() && - Member == E->getMemberDecl() && - Qualifier == E->getQualifier()) - return SemaRef.Owned(E->Retain()); - - // FIXME: Bogus source location for the operator - SourceLocation FakeOperatorLoc - = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); - - return getDerived().RebuildCXXAdornedMemberExpr(move(Base), - FakeOperatorLoc, - E->isArrow(), - Qualifier, - E->getQualifierRange(), - E->getMemberLoc(), - Member); -} - template<typename Derived> Sema::OwningExprResult TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( |