Rename CXXQualifiedMemberExpr -> CXXAdornedMemberExpr, since we will
also be adding explicit template arguments as an additional
"adornment". No functionality change.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80628 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index 449c5f3..cab807b 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -1457,7 +1457,7 @@
   
   // Accesses to members are potential references to data on the stack.
   case Stmt::MemberExprClass: 
-  case Stmt::CXXQualifiedMemberExprClass: {
+  case Stmt::CXXAdornedMemberExprClass: {
     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 026ff43..7f680f5 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -878,15 +878,15 @@
   return false;
 }
 
-/// \brief Build a MemberExpr or CXXQualifiedMemberExpr, as appropriate.
+/// \brief Build a MemberExpr or CXXAdornedMemberExpr, as appropriate.
 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) CXXQualifiedMemberExpr(Base, isArrow, 
-                                          (NestedNameSpecifier *)SS->getScopeRep(),
-                                          SS->getRange(),
-                                          Member, Loc, Ty);
+    return new (C) CXXAdornedMemberExpr(Base, isArrow, 
+                                        (NestedNameSpecifier *)SS->getScopeRep(),
+                                        SS->getRange(),
+                                        Member, Loc, Ty);
   
   return new (C) MemberExpr(Base, isArrow, Member, Loc, Ty);
 }
@@ -4837,7 +4837,7 @@
   case Stmt::QualifiedDeclRefExprClass:
     return cast<DeclRefExpr>(E)->getDecl();
   case Stmt::MemberExprClass:
-  case Stmt::CXXQualifiedMemberExprClass:
+  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 deb5411..8cb57d9 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1425,16 +1425,18 @@
   /// 
   /// By default, performs semantic analysis to build the new expression.
   /// Subclasses may override this routine to provide different behavior.
-  OwningExprResult RebuildCXXQualifiedMemberExpr(ExprArg Base, 
-                                                 SourceLocation OpLoc,
-                                                 bool isArrow, 
-                                                NestedNameSpecifier *Qualifier,
-                                                 SourceRange QualifierRange,
-                                                 SourceLocation MemberLoc,
-                                                 NamedDecl *Member) {
+  OwningExprResult RebuildCXXAdornedMemberExpr(ExprArg Base, 
+                                               SourceLocation OpLoc,
+                                               bool isArrow, 
+                                               NestedNameSpecifier *Qualifier,
+                                               SourceRange QualifierRange,
+                                               SourceLocation MemberLoc,
+                                               NamedDecl *Member) {
     CXXScopeSpec SS;
-    SS.setRange(QualifierRange);
-    SS.setScopeRep(Qualifier);
+    if (Qualifier) {
+      SS.setRange(QualifierRange);
+      SS.setScopeRep(Qualifier);
+    }
     return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
                                               isArrow? tok::arrow : tok::period,
                                               MemberLoc,
@@ -1588,6 +1590,9 @@
 NestedNameSpecifier *
 TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
                                                      SourceRange Range) {
+  if (!NNS)
+    return 0;
+  
   // Transform the prefix of this nested name specifier.
   NestedNameSpecifier *Prefix = NNS->getPrefix();
   if (Prefix) {
@@ -4014,8 +4019,8 @@
 
 template<typename Derived> 
 Sema::OwningExprResult 
-TreeTransform<Derived>::TransformCXXQualifiedMemberExpr(
-                                                  CXXQualifiedMemberExpr *E) { 
+TreeTransform<Derived>::TransformCXXAdornedMemberExpr(
+                                                  CXXAdornedMemberExpr *E) { 
   OwningExprResult Base = getDerived().TransformExpr(E->getBase());
   if (Base.isInvalid())
     return SemaRef.ExprError();
@@ -4028,7 +4033,7 @@
   NestedNameSpecifier *Qualifier
     = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
                                                 E->getQualifierRange());
-  if (Qualifier == 0)
+  if (Qualifier == 0 && E->getQualifier() != 0)
     return SemaRef.ExprError();
 
   if (!getDerived().AlwaysRebuild() &&
@@ -4041,7 +4046,7 @@
   SourceLocation FakeOperatorLoc
     = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
   
-  return getDerived().RebuildCXXQualifiedMemberExpr(move(Base), 
+  return getDerived().RebuildCXXAdornedMemberExpr(move(Base), 
                                                      FakeOperatorLoc,
                                                      E->isArrow(),
                                                      Qualifier,