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

Chris Lattner sabre at nondot.org
Wed May 19 22:14:08 PDT 2010


I fully approve... the current implementation is scary and TemplateArgumentList* need a *lot* more documentation.

-Chris

On May 19, 2010, at 5:59 PM, Douglas Gregor wrote:

> 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