[cfe-commits] r104194 - in /cfe/trunk: include/clang/AST/DeclTemplate.h lib/AST/DeclTemplate.cpp

Douglas Gregor dgregor at apple.com
Wed May 19 17:59:26 PDT 2010


Variadic templates are totally hosed. It would be best to remove the parsing of them entirely. 

Sent from my iPhone

On May 19, 2010, at 5:25 PM, Chris Lattner <sabre at nondot.org> wrote:

> Author: lattner
> Date: Wed May 19 19:25:36 2010
> New Revision: 104194
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=104194&view=rev
> Log:
> switch TemplateArgumentListBuilder to hold its flat argument list in a smallvector
> 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.
> 
> Modified:
>    cfe/trunk/include/clang/AST/DeclTemplate.h
>    cfe/trunk/lib/AST/DeclTemplate.cpp
> 
> Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=104194&r1=104193&r2=104194&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
> +++ cfe/trunk/include/clang/AST/DeclTemplate.h Wed May 19 19:25:36 2010
> @@ -112,7 +112,7 @@
>   unsigned MaxStructuredArgs;
>   unsigned NumStructuredArgs;
> 
> -  TemplateArgument *FlatArgs;
> +  llvm::SmallVector<TemplateArgument, 4> FlatArgs;
>   unsigned MaxFlatArgs;
>   unsigned NumFlatArgs;
> 
> @@ -127,16 +127,12 @@
>   MaxFlatArgs(std::max(MaxStructuredArgs, NumTemplateArgs)), NumFlatArgs(0),
>   AddingToPack(false), PackBeginIndex(0) { }
> 
> -  void Append(const TemplateArgument& Arg);
> +  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.
> 
> Modified: cfe/trunk/lib/AST/DeclTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=104194&r1=104193&r2=104194&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclTemplate.cpp (original)
> +++ cfe/trunk/lib/AST/DeclTemplate.cpp Wed May 19 19:25:36 2010
> @@ -303,22 +303,14 @@
> // 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 @@
>   assert(!StructuredArgs && "Argument list already contains a pack!");
> 
>   AddingToPack = true;
> -  PackBeginIndex = NumFlatArgs;
> +  PackBeginIndex = FlatArgs.size();
> }
> 
> void TemplateArgumentListBuilder::EndPack() {
> @@ -346,8 +338,9 @@
>   // 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);
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list