diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-08-31 23:41:50 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-08-31 23:41:50 +0000 |
commit | 83f6faf37d9bf58986bedc9bc0ea897a56b4dbad (patch) | |
tree | 66c6f0270874fe1b36d0be3a6b555fd8b7349695 /lib/Sema/TreeTransform.h | |
parent | ab88d97734f1260402a0c6a8f6b77bed7ed4e295 (diff) |
Eliminate CXXAdornedMemberExpr entirely. Instead, optionally allocate
space within the MemberExpr for the nested-name-specifier and its
source range. We'll do the same thing with explicitly-specified
template arguments, assuming I don't flip-flop again.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80642 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/TreeTransform.h')
-rw-r--r-- | lib/Sema/TreeTransform.h | 88 |
1 files changed, 24 insertions, 64 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 8cb57d904f..3879b39e6e 100644 --- a/lib/Sema/TreeTransform.h +++ b/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( |