Teach CXXScopeSpec to handle the extension of a nested-name-specifier
with another component in the nested-name-specifiers, updating its
representation (a NestedNameSpecifier) and source-location information
(currently a SourceRange) simultaneously. This is groundwork for
adding source-location information to nested-name-specifiers.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126346 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp
index 2fb9c0e..e12f62f 100644
--- a/lib/Parse/ParseExprCXX.cpp
+++ b/lib/Parse/ParseExprCXX.cpp
@@ -80,10 +80,9 @@
       return false;
 
     // '::' - Global scope qualifier.
-    SourceLocation CCLoc = ConsumeToken();
-    SS.setBeginLoc(CCLoc);
-    SS.setScopeRep(Actions.ActOnCXXGlobalScopeSpecifier(getCurScope(), CCLoc));
-    SS.setEndLoc(CCLoc);
+    if (Actions.ActOnCXXGlobalScopeSpecifier(getCurScope(), ConsumeToken(), SS))
+      return true;
+    
     HasScopeSpecifier = true;
   }
 
@@ -214,14 +213,14 @@
         }
 
         if (ParsedType T = getTypeAnnotation(TypeToken)) {
-          CXXScopeTy *Scope =
-            Actions.ActOnCXXNestedNameSpecifier(getCurScope(), SS, T,
-                                                TypeToken.getAnnotationRange(),
-                                                CCLoc);
-          SS.setScopeRep(Scope);
-        } else
-          SS.setScopeRep(0);
-        SS.setEndLoc(CCLoc);
+          if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(), T, CCLoc, SS))
+            SS.SetInvalid(SourceRange(SS.getBeginLoc(), CCLoc));
+          
+          continue;
+        } else {
+          SS.SetInvalid(SourceRange(SS.getBeginLoc(), CCLoc));
+        }
+        
         continue;
       }
 
@@ -245,7 +244,9 @@
     // If we get foo:bar, this is almost certainly a typo for foo::bar.  Recover
     // and emit a fixit hint for it.
     if (Next.is(tok::colon) && !ColonIsSacred) {
-      if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, II, ObjectType, 
+      if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, II, 
+                                            Tok.getLocation(), 
+                                            Next.getLocation(), ObjectType,
                                             EnteringContext) &&
           // If the token after the colon isn't an identifier, it's still an
           // error, but they probably meant something else strange so don't
@@ -274,16 +275,11 @@
              "NextToken() not working properly!");
       SourceLocation CCLoc = ConsumeToken();
 
-      if (!HasScopeSpecifier) {
-        SS.setBeginLoc(IdLoc);
-        HasScopeSpecifier = true;
-      }
-
-      if (!SS.isInvalid())
-        SS.setScopeRep(
-            Actions.ActOnCXXNestedNameSpecifier(getCurScope(), SS, IdLoc, CCLoc, II,
-                                                ObjectType, EnteringContext));
-      SS.setEndLoc(CCLoc);
+      HasScopeSpecifier = true;
+      if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(), II, IdLoc, CCLoc,
+                                              ObjectType, EnteringContext, SS))
+        SS.SetInvalid(SourceRange(IdLoc, CCLoc));
+      
       continue;
     }