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
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index cab807b..24eb8b1 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -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.
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 7f680f5..df94f20 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -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.
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 8cb57d9..3879b39 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -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(