Author: kremenek Date: Tue May 25 15:43:29 2010 New Revision: 104633 URL: http://llvm.org/viewvc/llvm-project?rev=104633&view=rev Log: 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. 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=104633&r1=104632&r2=104633&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/DeclTemplate.h (original) +++ cfe/trunk/include/clang/AST/DeclTemplate.h Tue May 25 15:43:29 2010 @@ -186,6 +186,11 @@ /// 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. Modified: cfe/trunk/lib/AST/DeclTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=104633&r1=104632&r2=104633&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclTemplate.cpp (original) +++ cfe/trunk/lib/AST/DeclTemplate.cpp Tue May 25 15:43:29 2010 @@ -374,7 +374,8 @@ // 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 @@ 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 @@ 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 //===----------------------------------------------------------------------===// _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits