Hi Doug, I'm not confident in my analysis, but I think this commit added a HasQualifier field to the MemberExpr which is not initialized by PCH. This is showing up in valgrind failures on the index tests: http://google1.osuosl.org:8011/builders/clang-x86_64-linux-vg/builds/3/steps/test-clang/logs/stdio
- Daniel On Mon, Aug 31, 2009 at 4:41 PM, Douglas Gregor<[email protected]> wrote: > Author: dgregor > Date: Mon Aug 31 18:41:50 2009 > New Revision: 80642 > > URL: http://llvm.org/viewvc/llvm-project?rev=80642&view=rev > Log: > 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. > > > Modified: > cfe/trunk/include/clang/AST/Expr.h > cfe/trunk/include/clang/AST/ExprCXX.h > cfe/trunk/include/clang/AST/StmtNodes.def > cfe/trunk/lib/AST/Expr.cpp > cfe/trunk/lib/AST/StmtPrinter.cpp > cfe/trunk/lib/AST/StmtProfile.cpp > cfe/trunk/lib/Analysis/GRExprEngine.cpp > cfe/trunk/lib/CodeGen/CGExpr.cpp > cfe/trunk/lib/Sema/SemaChecking.cpp > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/lib/Sema/TreeTransform.h > > Modified: cfe/trunk/include/clang/AST/Expr.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Expr.h (original) > +++ cfe/trunk/include/clang/AST/Expr.h Mon Aug 31 18:41:50 2009 > @@ -33,7 +33,6 @@ > class BlockDecl; > class CXXOperatorCallExpr; > class CXXMemberCallExpr; > - class CXXAdornedMemberExpr; > > /// Expr - This represents one expression. Note that Expr's are subclasses > of > /// Stmt. This allows an expression to be transparently used any place a > Stmt > @@ -1034,6 +1033,16 @@ > virtual child_iterator child_end(); > }; > > +/// \brief Represents the qualifier that may precede a C++ name, e.g., the > +/// "std::" in "std::sort". > +struct NameQualifier { > + /// \brief The nested name specifier. > + NestedNameSpecifier *NNS; > + > + /// \brief The source range covered by the nested name specifier. > + SourceRange Range; > +}; > + > /// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. > /// > class MemberExpr : public Expr { > @@ -1049,25 +1058,48 @@ > SourceLocation MemberLoc; > > /// IsArrow - True if this is "X->F", false if this is "X.F". > - bool IsArrow; > + bool IsArrow : 1; > > -protected: > - MemberExpr(StmtClass SC, Expr *base, bool isarrow, NamedDecl *memberdecl, > - SourceLocation l, QualType ty) > - : Expr(SC, ty, > - base->isTypeDependent(), base->isValueDependent()), > - Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow) {} > + /// \brief True if this member expression used a nested-name-specifier to > + /// refer to the member, e.g., "x->Base::f". > + bool HasQualifier : 1; > + > + /// \brief Retrieve the qualifier that preceded the member name, if any. > + NameQualifier *getMemberQualifier() { > + if (!HasQualifier) > + return 0; > + > + return reinterpret_cast<NameQualifier *> (this + 1); > + } > + > + /// \brief Retrieve the qualifier that preceded the member name, if any. > + const NameQualifier *getMemberQualifier() const { > + if (!HasQualifier) > + return 0; > + > + return reinterpret_cast<const NameQualifier *> (this + 1); > + } > > + MemberExpr(Expr *base, bool isarrow, NestedNameSpecifier *qual, > + SourceRange qualrange, NamedDecl *memberdecl, SourceLocation l, > + QualType ty); > + > public: > MemberExpr(Expr *base, bool isarrow, NamedDecl *memberdecl, SourceLocation > l, > QualType ty) > : Expr(MemberExprClass, ty, > base->isTypeDependent(), base->isValueDependent()), > - Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow) {} > + Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow), > + HasQualifier(false) {} > > /// \brief Build an empty member reference expression. > explicit MemberExpr(EmptyShell Empty) : Expr(MemberExprClass, Empty) { } > > + static MemberExpr *Create(ASTContext &C, Expr *base, bool isarrow, > + NestedNameSpecifier *qual, SourceRange qualrange, > + NamedDecl *memberdecl, > + SourceLocation l, QualType ty); > + > void setBase(Expr *E) { Base = E; } > Expr *getBase() const { return cast<Expr>(Base); } > > @@ -1081,7 +1113,27 @@ > /// \brief Determines whether this adorned member expression actually had > /// a C++ nested-name-specifier prior to the name of the member, e.g., > /// x->Base::foo. > - bool hasQualifier() const; > + bool hasQualifier() const { return HasQualifier; } > + > + /// \brief If the member name was qualified, retrieves the source range of > + /// the nested-name-specifier that precedes the member name. Otherwise, > + /// returns an empty source range. > + SourceRange getQualifierRange() const { > + if (!HasQualifier) > + return SourceRange(); > + > + return getMemberQualifier()->Range; > + } > + > + /// \brief If the member name was qualified, retrieves the > + /// nested-name-specifier that precedes the member name. Otherwise, returns > + /// NULL. > + NestedNameSpecifier *getQualifier() const { > + if (!HasQualifier) > + return 0; > + > + return getMemberQualifier()->NNS; > + } > > bool isArrow() const { return IsArrow; } > void setArrow(bool A) { IsArrow = A; } > @@ -1103,11 +1155,9 @@ > virtual SourceLocation getExprLoc() const { return MemberLoc; } > > static bool classof(const Stmt *T) { > - return T->getStmtClass() == MemberExprClass || > - T->getStmtClass() == CXXAdornedMemberExprClass; > + return T->getStmtClass() == MemberExprClass; > } > static bool classof(const MemberExpr *) { return true; } > - static bool classof(const CXXAdornedMemberExpr *) { return true; } > > // Iterators > virtual child_iterator child_begin(); > > Modified: cfe/trunk/include/clang/AST/ExprCXX.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/ExprCXX.h (original) > +++ cfe/trunk/include/clang/AST/ExprCXX.h Mon Aug 31 18:41:50 2009 > @@ -1285,43 +1285,6 @@ > virtual child_iterator child_end(); > }; > > -/// \brief Represents a C++ member access expression that was written using > -/// either a qualified name, e.g., "x->Base::f()" or originally had > -/// explicitly-specified template arguments (TODO!). > -class CXXAdornedMemberExpr : public MemberExpr { > - /// QualifierRange - The source range that covers the > - /// nested-name-specifier. > - SourceRange QualifierRange; > - > - /// \brief The nested-name-specifier that qualifies this declaration > - /// name. > - NestedNameSpecifier *Qualifier; > - > -public: > - CXXAdornedMemberExpr(Expr *base, bool isarrow, NestedNameSpecifier *Qual, > - SourceRange QualRange, NamedDecl *memberdecl, > - SourceLocation l, QualType ty) > - : MemberExpr(CXXAdornedMemberExprClass, base, isarrow, memberdecl, l, > ty), > - QualifierRange(QualRange), Qualifier(Qual) { } > - > - /// \brief Retrieve the source range of the nested-name-specifier that > - /// qualifies the member name. > - SourceRange getQualifierRange() const { return QualifierRange; } > - > - /// \brief Retrieve the nested-name-specifier that qualifies the > - /// member reference expression. > - NestedNameSpecifier *getQualifier() const { return Qualifier; } > - > - /// \brief Determines whether this adorned C++ member expression has a > - /// nested-name-specifier associated with it. > - bool hasQualifier() const { return getQualifier() != 0; } > - > - static bool classof(const Stmt *T) { > - return T->getStmtClass() == CXXAdornedMemberExprClass; > - } > - static bool classof(const CXXAdornedMemberExpr *) { return true; } > -}; > - > /// \brief Represents a C++ member access expression where the actual member > /// referenced could not be resolved, e.g., because the base expression or > the > /// member name was dependent. > > Modified: cfe/trunk/include/clang/AST/StmtNodes.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtNodes.def?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/StmtNodes.def (original) > +++ cfe/trunk/include/clang/AST/StmtNodes.def Mon Aug 31 18:41:50 2009 > @@ -134,7 +134,6 @@ > EXPR(CXXExprWithTemporaries , Expr) > EXPR(CXXTemporaryObjectExpr , CXXConstructExpr) > EXPR(CXXUnresolvedConstructExpr, Expr) > -EXPR(CXXAdornedMemberExpr, MemberExpr) > EXPR(CXXUnresolvedMemberExpr, Expr) > > // Obj-C Expressions. > > Modified: cfe/trunk/lib/AST/Expr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/Expr.cpp (original) > +++ cfe/trunk/lib/AST/Expr.cpp Mon Aug 31 18:41:50 2009 > @@ -262,6 +262,36 @@ > return FnType->getResultType(); > } > > +MemberExpr::MemberExpr(Expr *base, bool isarrow, NestedNameSpecifier *qual, > + SourceRange qualrange, NamedDecl *memberdecl, > + SourceLocation l, QualType ty) > + : Expr(MemberExprClass, ty, > + base->isTypeDependent() || (qual && qual->isDependent()), > + base->isValueDependent() || (qual && qual->isDependent())), > + Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow), > + HasQualifier(qual != 0) { > + // Initialize the qualifier, if any. > + if (HasQualifier) { > + NameQualifier *NQ = getMemberQualifier(); > + NQ->NNS = qual; > + NQ->Range = qualrange; > + } > +} > + > +MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow, > + NestedNameSpecifier *qual, > + SourceRange qualrange, > + NamedDecl *memberdecl, > + SourceLocation l, QualType ty) { > + std::size_t Size = sizeof(MemberExpr); > + if (qual != 0) > + Size += sizeof(NameQualifier); > + > + void *Mem = C.Allocate(Size, llvm::alignof<MemberExpr>()); > + return new (Mem) MemberExpr(base, isarrow, qual, qualrange, memberdecl, l, > + ty); > +} > + > /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it > /// corresponds to, e.g. "<<=". > const char *BinaryOperator::getOpcodeStr(Opcode Op) { > @@ -498,7 +528,6 @@ > } > > case MemberExprClass: > - case CXXAdornedMemberExprClass: > // If the base pointer or element is to a volatile pointer/field, > accessing > // it is a side effect. > if (getType().isVolatileQualified()) > @@ -686,8 +715,7 @@ > return LV_Valid; > break; > } > - case MemberExprClass: > - case CXXAdornedMemberExprClass: { > + case MemberExprClass: { > const MemberExpr *m = cast<MemberExpr>(this); > if (Ctx.getLangOptions().CPlusPlus) { // C++ [expr.ref]p4: > NamedDecl *Member = m->getMemberDecl(); > @@ -958,8 +986,7 @@ > } > return false; > } > - case MemberExprClass: > - case CXXAdornedMemberExprClass: { > + case MemberExprClass: { > const MemberExpr *M = cast<MemberExpr>(this); > return M->getBase()->isOBJCGCCandidate(Ctx); > } > @@ -1917,13 +1944,6 @@ > Stmt::child_iterator MemberExpr::child_begin() { return &Base; } > Stmt::child_iterator MemberExpr::child_end() { return &Base+1; } > > -bool MemberExpr::hasQualifier() const { > - if (const CXXAdornedMemberExpr *A = dyn_cast<CXXAdornedMemberExpr>(this)) > - return A->hasQualifier(); > - > - return false; > -} > - > // ExtVectorElementExpr > Stmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; } > Stmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; } > > Modified: cfe/trunk/lib/AST/StmtPrinter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/StmtPrinter.cpp (original) > +++ cfe/trunk/lib/AST/StmtPrinter.cpp Mon Aug 31 18:41:50 2009 > @@ -739,6 +739,9 @@ > OS << (Node->isArrow() ? "->" : "."); > // FIXME: Suppress printing references to unnamed objects > // representing anonymous unions/structs > + if (NestedNameSpecifier *Qualifier = Node->getQualifier()) > + Qualifier->print(OS, Policy); > + > OS << Node->getMemberDecl()->getNameAsString(); > } > void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) { > @@ -1126,16 +1129,6 @@ > OS << ")"; > } > > -void StmtPrinter::VisitCXXAdornedMemberExpr(CXXAdornedMemberExpr *Node) { > - // FIXME: Suppress printing implicit bases (like "this") > - PrintExpr(Node->getBase()); > - OS << (Node->isArrow() ? "->" : "."); > - // FIXME: Suppress printing references to unnamed objects > - // representing anonymous unions/structs > - Node->getQualifier()->print(OS, Policy); > - OS << Node->getMemberDecl()->getNameAsString(); > -} > - > void StmtPrinter::VisitCXXUnresolvedMemberExpr(CXXUnresolvedMemberExpr > *Node) { > PrintExpr(Node->getBase()); > OS << (Node->isArrow() ? "->" : "."); > > Modified: cfe/trunk/lib/AST/StmtProfile.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/StmtProfile.cpp (original) > +++ cfe/trunk/lib/AST/StmtProfile.cpp Mon Aug 31 18:41:50 2009 > @@ -272,6 +272,7 @@ > void StmtProfiler::VisitMemberExpr(MemberExpr *S) { > VisitExpr(S); > VisitDecl(S->getMemberDecl()); > + VisitNestedNameSpecifier(S->getQualifier()); > ID.AddBoolean(S->isArrow()); > } > > @@ -546,11 +547,6 @@ > VisitType(S->getTypeAsWritten()); > } > > -void StmtProfiler::VisitCXXAdornedMemberExpr(CXXAdornedMemberExpr *S) { > - VisitMemberExpr(S); > - VisitNestedNameSpecifier(S->getQualifier()); > -} > - > void StmtProfiler::VisitCXXUnresolvedMemberExpr(CXXUnresolvedMemberExpr *S) { > VisitExpr(S); > ID.AddBoolean(S->isArrow()); > > Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original) > +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Mon Aug 31 18:41:50 2009 > @@ -407,7 +407,6 @@ > break; > > case Stmt::MemberExprClass: > - case Stmt::CXXAdornedMemberExprClass: > VisitMemberExpr(cast<MemberExpr>(S), Pred, Dst, false); > break; > > @@ -514,7 +513,6 @@ > return; > > case Stmt::MemberExprClass: > - case Stmt::CXXAdornedMemberExprClass: > VisitMemberExpr(cast<MemberExpr>(Ex), Pred, Dst, true); > return; > > > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Aug 31 18:41:50 2009 > @@ -241,7 +241,6 @@ > case Expr::ExtVectorElementExprClass: > return EmitExtVectorElementExpr(cast<ExtVectorElementExpr>(E)); > case Expr::MemberExprClass: > - case Stmt::CXXAdornedMemberExprClass: > return EmitMemberExpr(cast<MemberExpr>(E)); > case Expr::CompoundLiteralExprClass: > return EmitCompoundLiteralLValue(cast<CompoundLiteralExpr>(E)); > > Modified: cfe/trunk/lib/Sema/SemaChecking.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) > +++ cfe/trunk/lib/Sema/SemaChecking.cpp Mon Aug 31 18:41:50 2009 > @@ -1456,8 +1456,7 @@ > } > > // 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. > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Aug 31 18:41:50 2009 > @@ -878,15 +878,14 @@ > 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 @@ > 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. > > Modified: cfe/trunk/lib/Sema/TreeTransform.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=80642&r1=80641&r2=80642&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/TreeTransform.h (original) > +++ cfe/trunk/lib/Sema/TreeTransform.h Mon Aug 31 18:41:50 2009 > @@ -835,13 +835,23 @@ > /// 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 @@ > 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 @@ > 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 @@ > > if (!getDerived().AlwaysRebuild() && > Base.get() == E->getBase() && > + Qualifier == E->getQualifier() && > Member == E->getMemberDecl()) > return SemaRef.Owned(E->Retain()); > > @@ -2989,6 +2985,8 @@ > > return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, > E->isArrow(), > + Qualifier, > + E->getQualifierRange(), > E->getMemberLoc(), > Member); > } > @@ -4016,45 +4014,7 @@ > 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( > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
