[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