]> granicus.if.org Git - clang/commitdiff
switch TemplateArgumentListBuilder to hold its flat argument list in a smallvector
authorChris Lattner <sabre@nondot.org>
Thu, 20 May 2010 00:25:36 +0000 (00:25 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 20 May 2010 00:25:36 +0000 (00:25 +0000)
instead of new[]'d.  This greatly reduces the number of new[]'s, and guess what,
they were all leaked.

This adds a fixme in this hunk:

   unsigned NumPackArgs = NumFlatArgs - PackBeginIndex;
+  // FIXME: NumPackArgs shouldn't be negative here???
   if (NumPackArgs)
-    PackArgs = &FlatArgs[PackBeginIndex];
+    PackArgs = FlatArgs.data()+PackBeginIndex;

where test/SemaTemplate/variadic-class-template-2.cpp is accessing the vector
out of range and NumPackArgs is negative.  I assume variadic template args are
completely hosed.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104194 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 2a3e8add145ff630970c41901b3e6a511d0c4689..040aad03ba5cc740c4b4a306e717bbd54e917b89 100644 (file)
@@ -112,7 +112,7 @@ class TemplateArgumentListBuilder {
   unsigned MaxStructuredArgs;
   unsigned NumStructuredArgs;
 
-  TemplateArgument *FlatArgs;
+  llvm::SmallVector<TemplateArgument, 4> FlatArgs;
   unsigned MaxFlatArgs;
   unsigned NumFlatArgs;
 
@@ -127,16 +127,12 @@ public:
   MaxFlatArgs(std::max(MaxStructuredArgs, NumTemplateArgs)), NumFlatArgs(0),
   AddingToPack(false), PackBeginIndex(0) { }
 
-  void Append(const TemplateArgumentArg);
+  void Append(const TemplateArgument &Arg);
   void BeginPack();
   void EndPack();
 
-  unsigned flatSize() const {
-    return NumFlatArgs;
-  }
-  const TemplateArgument *getFlatArguments() const {
-    return FlatArgs;
-  }
+  unsigned flatSize() const { return FlatArgs.size(); }
+  const TemplateArgument *getFlatArguments() const { return FlatArgs.data(); }
 
   unsigned structuredSize() const {
     // If we don't have any structured args, just reuse the flat size.
index 5317c7bff6ef9506dae22d8c8fdcc4b4ab7c14be..98c5bb78ff2f76de80ca12ac6a488adf032cb839 100644 (file)
@@ -303,22 +303,14 @@ TemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
 // TemplateArgumentListBuilder Implementation
 //===----------------------------------------------------------------------===//
 
-void TemplateArgumentListBuilder::Append(const TemplateArgument& Arg) {
-  switch (Arg.getKind()) {
-    default: break;
-    case TemplateArgument::Type:
-      assert(Arg.getAsType().isCanonical() && "Type must be canonical!");
-      break;
-  }
-
-  assert(NumFlatArgs < MaxFlatArgs && "Argument list builder is full!");
+void TemplateArgumentListBuilder::Append(const TemplateArgument &Arg) {
+  assert((Arg.getKind() != TemplateArgument::Type ||
+          Arg.getAsType().isCanonical()) && "Type must be canonical!");
+  assert(FlatArgs.size() < MaxFlatArgs && "Argument list builder is full!");
   assert(!StructuredArgs &&
          "Can't append arguments when an argument pack has been added!");
 
-  if (!FlatArgs)
-    FlatArgs = new TemplateArgument[MaxFlatArgs];
-
-  FlatArgs[NumFlatArgs++] = Arg;
+  FlatArgs.push_back(Arg);
 }
 
 void TemplateArgumentListBuilder::BeginPack() {
@@ -326,7 +318,7 @@ void TemplateArgumentListBuilder::BeginPack() {
   assert(!StructuredArgs && "Argument list already contains a pack!");
 
   AddingToPack = true;
-  PackBeginIndex = NumFlatArgs;
+  PackBeginIndex = FlatArgs.size();
 }
 
 void TemplateArgumentListBuilder::EndPack() {
@@ -346,8 +338,9 @@ void TemplateArgumentListBuilder::EndPack() {
   // Next, set the pack.
   TemplateArgument *PackArgs = 0;
   unsigned NumPackArgs = NumFlatArgs - PackBeginIndex;
+  // FIXME: NumPackArgs shouldn't be negative here???
   if (NumPackArgs)
-    PackArgs = &FlatArgs[PackBeginIndex];
+    PackArgs = FlatArgs.data()+PackBeginIndex;
 
   StructuredArgs[NumStructuredArgs++].setArgumentPack(PackArgs, NumPackArgs,
                                                       /*CopyArgs=*/false);