More parameter pack work.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73395 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp
index d57a430..ea8dd0d 100644
--- a/lib/AST/DeclTemplate.cpp
+++ b/lib/AST/DeclTemplate.cpp
@@ -265,25 +265,28 @@
     break;
   }
   
-  if (!isAddingFromParameterPack()) {
-    // Add begin and end indicies.
-    Indices.push_back(Args.size());
-    Indices.push_back(Args.size());
-  }
-
-  Args.push_back(Arg);
+  FlatArgs.push_back(Arg);
+  
+  if (!isAddingFromParameterPack())
+    StructuredArgs.push_back(Arg);
 }
 
 void TemplateArgumentListBuilder::BeginParameterPack() {
   assert(!isAddingFromParameterPack() && "Already adding to parameter pack!");
-  
-  Indices.push_back(Args.size());
+
+  PackBeginIndex = FlatArgs.size();
 }
 
 void TemplateArgumentListBuilder::EndParameterPack() {
   assert(isAddingFromParameterPack() && "Not adding to parameter pack!");
+
+  unsigned NumArgs = FlatArgs.size() - PackBeginIndex;
+  TemplateArgument *Args = NumArgs ? &FlatArgs[PackBeginIndex] : 0;
   
-  Indices.push_back(Args.size());
+  StructuredArgs.push_back(TemplateArgument(SourceLocation(), Args, NumArgs,
+                                            /*CopyArgs=*/false));
+  
+  PackBeginIndex = std::numeric_limits<unsigned>::max();
 }  
 
 //===----------------------------------------------------------------------===//
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index 2b2272d..d7a8a72 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -850,7 +850,7 @@
                                 ConvertedTemplateArgs))
     return QualType();
 
-  assert((ConvertedTemplateArgs.size() == 
+  assert((ConvertedTemplateArgs.structuredSize() == 
             Template->getTemplateParameters()->size()) &&
          "Converted template argument list is too short!");
 
@@ -2301,7 +2301,7 @@
                                 RAngleLoc, ConvertedTemplateArgs))
     return true;
 
-  assert((ConvertedTemplateArgs.size() == 
+  assert((ConvertedTemplateArgs.structuredSize() == 
             ClassTemplate->getTemplateParameters()->size()) &&
          "Converted template argument list is too short!");
   
@@ -2562,7 +2562,7 @@
                                 RAngleLoc, ConvertedTemplateArgs))
     return true;
 
-  assert((ConvertedTemplateArgs.size() == 
+  assert((ConvertedTemplateArgs.structuredSize() == 
             ClassTemplate->getTemplateParameters()->size()) &&
          "Converted template argument list is too short!");