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

Ted Kremenek kremenek at apple.com
Tue May 25 13:43:29 PDT 2010


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
 //===----------------------------------------------------------------------===//





More information about the cfe-commits mailing list