diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-05-25 20:43:29 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-05-25 20:43:29 +0000 |
commit | f5bcc6a285fdf8c510c20742266f75d05e480d7f (patch) | |
tree | ba0c239cc252e285f0da48a4edce8b33ac43e573 | |
parent | cd4ba6caba019fb31f19ed4fe10ed5bcbfd5320c (diff) | |
download | bcm5719-llvm-f5bcc6a285fdf8c510c20742266f75d05e480d7f.tar.gz bcm5719-llvm-f5bcc6a285fdf8c510c20742266f75d05e480d7f.zip |
Allocate the contents of TemplateArgumentList using ASTContext's allocator. This fixes
a massive memory leak when using a BumpPtrAllocator in ASTContext.
Added a FIXME, as the Destroy method for TemplateArgumentList isn't getting called.
This means we will instead leak when using the MallocAllocator.
llvm-svn: 104633
-rw-r--r-- | clang/include/clang/AST/DeclTemplate.h | 5 | ||||
-rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 14 |
2 files changed, 14 insertions, 5 deletions
diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index 89b43a243c2..b7b90b14adf 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -186,6 +186,11 @@ public: /// really isn't safe to use that way. explicit TemplateArgumentList(const TemplateArgumentList *Other); + /// Used to release the memory associated with a TemplateArgumentList + /// object. FIXME: This is currently not called anywhere, but the + /// memory will still be freed when using a BumpPtrAllocator. + void Destroy(ASTContext &C); + ~TemplateArgumentList(); /// \brief Retrieve the template argument at a given index. diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 17bd2217fca..26e291c94f6 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -374,7 +374,8 @@ TemplateArgumentList::TemplateArgumentList(ASTContext &Context, // If this does take ownership of the arguments, then we have to new them // and copy over. - TemplateArgument *NewArgs = new TemplateArgument[Builder.flatSize()]; + TemplateArgument *NewArgs = + new (Context) TemplateArgument[Builder.flatSize()]; std::copy(Builder.getFlatArguments(), Builder.getFlatArguments()+Builder.flatSize(), NewArgs); FlatArguments.setPointer(NewArgs); @@ -384,7 +385,8 @@ TemplateArgumentList::TemplateArgumentList(ASTContext &Context, StructuredArguments.setPointer(NewArgs); StructuredArguments.setInt(0); } else { - TemplateArgument *NewSArgs = new TemplateArgument[Builder.flatSize()]; + TemplateArgument *NewSArgs = + new (Context) TemplateArgument[Builder.flatSize()]; std::copy(Builder.getFlatArguments(), Builder.getFlatArguments()+Builder.flatSize(), NewSArgs); StructuredArguments.setPointer(NewSArgs); @@ -401,13 +403,15 @@ TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList *Other) StructuredArguments(Other->StructuredArguments.getPointer(), false), NumStructuredArguments(Other->NumStructuredArguments) { } -TemplateArgumentList::~TemplateArgumentList() { +void TemplateArgumentList::Destroy(ASTContext &C) { if (FlatArguments.getInt()) - delete [] FlatArguments.getPointer(); + C.Deallocate((void*)FlatArguments.getPointer()); if (StructuredArguments.getInt()) - delete [] StructuredArguments.getPointer(); + C.Deallocate((void*)StructuredArguments.getPointer()); } +TemplateArgumentList::~TemplateArgumentList() {} + //===----------------------------------------------------------------------===// // ClassTemplateSpecializationDecl Implementation //===----------------------------------------------------------------------===// |