]> granicus.if.org Git - clang/commitdiff
Allocate the contents of TemplateArgumentList using ASTContext's allocator. This...
authorTed Kremenek <kremenek@apple.com>
Tue, 25 May 2010 20:43:29 +0000 (20:43 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 25 May 2010 20:43:29 +0000 (20:43 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104633 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclTemplate.h
lib/AST/DeclTemplate.cpp

index 89b43a243c204e33a42c53c297dbb2e6c3d0cb46..b7b90b14adfd92f172769a69211b7c8c0b0eee0b 100644 (file)
@@ -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.
index 17bd2217fca11ab74a8de0937ee7905faebb6e3b..26e291c94f6422fadb8f05b9b7391ad9371c89ec 100644 (file)
@@ -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
 //===----------------------------------------------------------------------===//