diff options
-rw-r--r-- | include/clang/AST/DeclTemplate.h | 8 | ||||
-rw-r--r-- | lib/AST/DeclTemplate.cpp | 32 |
2 files changed, 25 insertions, 15 deletions
diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index 3af89f9377..89eb152e85 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -131,8 +131,6 @@ public: void BeginPack(); void EndPack(); - void ReleaseArgs(); - unsigned flatSize() const { return NumFlatArgs; } @@ -165,7 +163,7 @@ class TemplateArgumentList { /// \brief The template argument list. /// /// The integer value will be non-zero to indicate that this - /// template argument list does not own the pointer. + /// template argument list does own the pointer. llvm::PointerIntPair<const TemplateArgument *, 1> FlatArguments; /// \brief The number of template arguments in this template @@ -176,6 +174,10 @@ class TemplateArgumentList { unsigned NumStructuredArguments; public: + /// TemplateArgumentList - If this constructor is passed "true" for 'TakeArgs' + /// it copies them into a locally new[]'d array. If passed "false", then it + /// just references the array passed in. This is only safe if the builder + /// outlives it, but saves a copy. TemplateArgumentList(ASTContext &Context, TemplateArgumentListBuilder &Builder, bool TakeArgs); diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index cf4a242df7..fe17399155 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -353,15 +353,6 @@ void TemplateArgumentListBuilder::EndPack() { /*CopyArgs=*/false); } -void TemplateArgumentListBuilder::ReleaseArgs() { - FlatArgs = 0; - NumFlatArgs = 0; - MaxFlatArgs = 0; - StructuredArgs = 0; - NumStructuredArgs = 0; - MaxStructuredArgs = 0; -} - //===----------------------------------------------------------------------===// // TemplateArgumentList Implementation //===----------------------------------------------------------------------===// @@ -376,9 +367,23 @@ TemplateArgumentList::TemplateArgumentList(ASTContext &Context, if (!TakeArgs) return; - if (Builder.getStructuredArguments() == Builder.getFlatArguments()) + // If this does take ownership of the arguments, then we have to new them + // and copy over. + TemplateArgument *NewArgs = new TemplateArgument[Builder.flatSize()]; + std::copy(Builder.getFlatArguments(), + Builder.getFlatArguments()+Builder.flatSize(), NewArgs); + FlatArguments.setPointer(NewArgs); + + // Just reuse the structured and flat arguments array if possible. + if (Builder.getStructuredArguments() == Builder.getFlatArguments()) { + StructuredArguments.setPointer(NewArgs); StructuredArguments.setInt(0); - Builder.ReleaseArgs(); + } else { + TemplateArgument *NewSArgs = new TemplateArgument[Builder.flatSize()]; + std::copy(Builder.getFlatArguments(), + Builder.getFlatArguments()+Builder.flatSize(), NewSArgs); + StructuredArguments.setPointer(NewSArgs); + } } TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList &Other) @@ -388,7 +393,10 @@ TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList &Other) NumStructuredArguments(Other.NumStructuredArguments) { } TemplateArgumentList::~TemplateArgumentList() { - // FIXME: Deallocate template arguments + if (FlatArguments.getInt()) + delete [] FlatArguments.getPointer(); + if (StructuredArguments.getInt()) + delete [] StructuredArguments.getPointer(); } //===----------------------------------------------------------------------===// |