]> granicus.if.org Git - clang/commitdiff
Improvements to TemplateArgumentListBuilder to make it work better with parameter...
authorAnders Carlsson <andersca@mac.com>
Sat, 13 Jun 2009 00:08:58 +0000 (00:08 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 13 Jun 2009 00:08:58 +0000 (00:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73272 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclBase.h
include/clang/AST/DeclTemplate.h
lib/AST/DeclBase.cpp
lib/AST/DeclTemplate.cpp

index c061b857063a581d1691a995dede716617776b2d..5c9fd342fa968afc497d22026824037b627c3edf 100644 (file)
@@ -298,9 +298,13 @@ public:
   static bool CollectingStats(bool Enable = false);
   static void PrintStats();
     
-  /// isTemplateParameter - Determines whether this declartion is a
+  /// isTemplateParameter - Determines whether this declaration is a
   /// template parameter.
   bool isTemplateParameter() const;
+  
+  /// isTemplateParameter - Determines whether this declaration is a
+  /// template parameter pack.
+  bool isTemplateParameterPack() const;
 
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *) { return true; }
index c301d4608d59fce264d32611cd15db93b574d148..ca4758031df3bcd9dc979c93a7477d10a2247dda 100644 (file)
@@ -592,17 +592,37 @@ public:
 
 /// \brief A helper class for making template argument lists.
 class TemplateArgumentListBuilder {
+  /// Args - contains the template arguments.
   llvm::SmallVector<TemplateArgument, 16> Args;
+  
+  llvm::SmallVector<unsigned, 32> Indices;
 
   ASTContext &Context;
+  
+  /// isAddingFromParameterPack - Returns whether we're adding arguments from
+  /// a parameter pack.
+  bool isAddingFromParameterPack() const { return Indices.size() % 2; }
+  
 public:
   TemplateArgumentListBuilder(ASTContext &Context) : Context(Context) { }
   
-  // FIXME: Should use the  index array size.
-  size_t size() const { return Args.size(); }
+  size_t size() const { 
+    assert(!isAddingFromParameterPack() && 
+           "Size is not valid when adding from a parameter pack");
+    
+    return Args.size(); 
+  }
+  
   size_t flatSize() const { return Args.size(); }
 
   void push_back(const TemplateArgument& Arg);
+  
+  /// BeginParameterPack - Start adding arguments from a parameter pack.
+  void BeginParameterPack();
+  
+  /// EndParameterPack - Finish adding arguments from a parameter pack.
+  void EndParameterPack();
+  
   TemplateArgument *getFlatArgumentList() { return Args.data(); }
 };
 
index fd7de715db7ff99002cbeb92c60d495f0814acdd..a39a506de0ae1a6c4dfc14ccf8c7effbdddc01b6 100644 (file)
@@ -95,6 +95,13 @@ void Decl::addDeclKind(Kind k) {
   }
 }
 
+bool Decl::isTemplateParameterPack() const {
+  if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(this))
+    return TTP->isParameterPack();
+  
+  return false;
+}
+
 //===----------------------------------------------------------------------===//
 // PrettyStackTraceDecl Implementation
 //===----------------------------------------------------------------------===//
index a0773f12d75d1f9e6a42a7a93575a56936378d34..9526b48468c7bf20920bb3b56ddba1d72793a88d 100644 (file)
@@ -247,9 +247,27 @@ void TemplateArgumentListBuilder::push_back(const TemplateArgument& Arg) {
     break;
   }
   
+  if (!isAddingFromParameterPack()) {
+    // Add begin and end indicies.
+    Indices.push_back(Args.size());
+    Indices.push_back(Args.size());
+  }
+
   Args.push_back(Arg);
 }
 
+void TemplateArgumentListBuilder::BeginParameterPack() {
+  assert(!isAddingFromParameterPack() && "Already adding to parameter pack!");
+  
+  Indices.push_back(Args.size());
+}
+
+void TemplateArgumentListBuilder::EndParameterPack() {
+  assert(isAddingFromParameterPack() && "Not adding to parameter pack!");
+  
+  Indices.push_back(Args.size());
+}  
+
 //===----------------------------------------------------------------------===//
 // TemplateArgumentList Implementation
 //===----------------------------------------------------------------------===//