Simplify CXXScopeSpec a lot. No more weird SmallVector-like hacks here

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67800 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/DeclSpec.cpp b/lib/Parse/DeclSpec.cpp
index 72ac311..94799c3 100644
--- a/lib/Parse/DeclSpec.cpp
+++ b/lib/Parse/DeclSpec.cpp
@@ -24,67 +24,6 @@
   return D.Report(FullSourceLoc(Loc, SrcMgr), DiagID);
 }
 
-/// \brief Double the capacity of this scope specifier.
-void CXXScopeSpec::reallocate() {
-  Action::CXXScopeTy **Data = new Action::CXXScopeTy *[Capacity * 2];
-
-  Action::CXXScopeTy **From 
-    = Capacity == 4? &InlineScopeReps[0] : ManyScopeReps;
-  std::memcpy(Data, From, Capacity * sizeof(Action::CXXScopeTy *));
-  
-  if (Capacity > 4)
-    delete [] ManyScopeReps;
-  ManyScopeReps = Data;
-  Capacity *= 2;
-}
-
-CXXScopeSpec::CXXScopeSpec(const CXXScopeSpec &SS) 
-  : Range(SS.Range), NumScopeReps(SS.NumScopeReps), Capacity(SS.Capacity) {
-
-  if (Capacity > 4) {
-    ManyScopeReps = new Action::CXXScopeTy *[Capacity];
-    memcpy(ManyScopeReps, SS.ManyScopeReps, 
-           Capacity * sizeof(Action::CXXScopeTy *));
-  } else {
-    memcpy(InlineScopeReps, SS.InlineScopeReps, 
-           Capacity * sizeof(Action::CXXScopeTy *));
-  }
-}
-
-CXXScopeSpec &CXXScopeSpec::operator=(const CXXScopeSpec &SS) {
-  // FIXME: Does not provide the strong exception safety guarantee.
-  this->~CXXScopeSpec();
-  new (this) CXXScopeSpec(SS);
-  return *this;
-}
-
-void *CXXScopeSpec::buildAnnotationData() const {
-  uintptr_t *Data = (uintptr_t *)malloc(sizeof(uintptr_t) * (size() + 1));
-  Data[0] = size();
-  for (unsigned I = 0; I < size(); ++I)
-    Data[I + 1] = reinterpret_cast<uintptr_t>(getScopeRep(I));
-  return Data;
-}
-
-void CXXScopeSpec::setFromAnnotationData(void *DataIn) {
-  uintptr_t *Data = static_cast<uintptr_t *>(DataIn);
-  NumScopeReps = *Data;
-
-  // Allocate enough space for the annotation data.
-  if (NumScopeReps > Capacity) {
-    if (Capacity > 4)
-      delete [] ManyScopeReps;
-    
-    Capacity = NumScopeReps;
-    ManyScopeReps = new Action::CXXScopeTy *[Capacity];
-  }
-
-  if (Capacity > 4)
-    std::memcpy(ManyScopeReps, Data + 1, sizeof(uintptr_t) * NumScopeReps);
-  else
-    std::memcpy(InlineScopeReps, Data + 1, sizeof(uintptr_t) * NumScopeReps);
-}
-
 /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
 /// "TheDeclarator" is the declarator that this will be added to.
 DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, bool isVariadic,
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp
index 7a92171..a9fbbbe 100644
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -515,7 +515,7 @@
         goto DoneWithDeclSpec;
 
       CXXScopeSpec SS;
-      SS.setFromAnnotationData(Tok.getAnnotationValue());
+      SS.setScopeRep(Tok.getAnnotationValue());
       SS.setRange(Tok.getAnnotationRange());
 
       // If the next token is the name of the class type that the C++ scope
@@ -532,7 +532,6 @@
       if (TypeRep == 0)
         goto DoneWithDeclSpec;
       
-      CXXScopeSpec::freeAnnotationData(Tok.getAnnotationValue());
       ConsumeToken(); // The C++ scope.
 
       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp
index 731f4c7..b3ec24f 100644
--- a/lib/Parse/ParseExprCXX.cpp
+++ b/lib/Parse/ParseExprCXX.cpp
@@ -36,8 +36,7 @@
          "Call sites of this function should be guarded by checking for C++");
 
   if (Tok.is(tok::annot_cxxscope)) {
-    SS.setFromAnnotationData(Tok.getAnnotationValue());
-    CXXScopeSpec::freeAnnotationData(Tok.getAnnotationValue());
+    SS.setScopeRep(Tok.getAnnotationValue());
     SS.setRange(Tok.getAnnotationRange());
     ConsumeToken();
     return true;
@@ -54,7 +53,7 @@
     // '::' - Global scope qualifier.
     SourceLocation CCLoc = ConsumeToken();
     SS.setBeginLoc(CCLoc);
-    SS.addScopeRep(Actions.ActOnCXXGlobalScopeSpecifier(CurScope, CCLoc));
+    SS.setScopeRep(Actions.ActOnCXXGlobalScopeSpecifier(CurScope, CCLoc));
     SS.setEndLoc(CCLoc);
     HasScopeSpecifier = true;
   }
@@ -80,7 +79,7 @@
       if (SS.isInvalid())
         continue;
       
-      SS.addScopeRep(
+      SS.setScopeRep(
         Actions.ActOnCXXNestedNameSpecifier(CurScope, SS, IdLoc, CCLoc, *II));
       SS.setEndLoc(CCLoc);
       continue;
@@ -165,7 +164,7 @@
           HasScopeSpecifier = true;
         }
 
-        SS.addScopeRep(
+        SS.setScopeRep(
           Actions.ActOnCXXNestedNameSpecifier(CurScope, SS, 
                                               TypeToken.getAnnotationValue(),
                                               TypeToken.getAnnotationRange(),
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index 7a221d0..5ce8b3d 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -866,7 +866,7 @@
   else
     PP.EnterToken(Tok);
   Tok.setKind(tok::annot_cxxscope);
-  Tok.setAnnotationValue(SS.buildAnnotationData());
+  Tok.setAnnotationValue(SS.getScopeRep());
   Tok.setAnnotationRange(SS.getRange());
 
   // In case the tokens were cached, have Preprocessor replace them with the
@@ -898,7 +898,7 @@
   else
     PP.EnterToken(Tok);
   Tok.setKind(tok::annot_cxxscope);
-  Tok.setAnnotationValue(SS.buildAnnotationData());
+  Tok.setAnnotationValue(SS.getScopeRep());
   Tok.setAnnotationRange(SS.getRange());
 
   // In case the tokens were cached, have Preprocessor replace them with the