[cfe-commits] r80642 - in /cfe/trunk: include/clang/AST/Expr.h include/clang/AST/ExprCXX.h include/clang/AST/StmtNodes.def lib/AST/Expr.cpp lib/AST/StmtPrinter.cpp lib/AST/StmtProfile.cpp lib/Analysis/GRExprEngine.cpp lib/CodeGen/CGExpr.cpp lib/S
Daniel Dunbar
daniel at zuster.org
Thu Sep 3 21:19:53 PDT 2009
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<dgregor at apple.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list