]> granicus.if.org Git - clang/commitdiff
Allocate template parameter lists for out-of-line definitions via the
authorDouglas Gregor <dgregor@apple.com>
Tue, 15 Jun 2010 17:44:38 +0000 (17:44 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 15 Jun 2010 17:44:38 +0000 (17:44 +0000)
ASTContext rather than via the normal heap.

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

include/clang/AST/Decl.h
lib/AST/Decl.cpp
lib/Sema/SemaDecl.cpp
lib/Sema/SemaTemplate.cpp

index 2c7dfecab97dfec556fbf58f7c51bd244f710d08..f4ca149b5a1dd7424b69acf8dde336140b1bc076 100644 (file)
@@ -385,10 +385,12 @@ struct QualifierInfo {
     : NNS(0), NNSRange(), NumTemplParamLists(0), TemplParamLists(0) {}
   /// setTemplateParameterListsInfo - Sets info about matched template
   /// parameter lists.
-  void setTemplateParameterListsInfo(unsigned NumTPLists,
+  void setTemplateParameterListsInfo(ASTContext &Context,
+                                     unsigned NumTPLists,
                                      TemplateParameterList **TPLists);
-  /// Destructor: frees the array of template parameter lists pointers.
-  ~QualifierInfo() { delete[] TemplParamLists; }
+  
+  void Destroy(ASTContext &Context);
+  
 private:
   // Copy constructor and copy assignment are disabled.
   QualifierInfo(const QualifierInfo&);
@@ -447,9 +449,9 @@ public:
     assert(index < getNumTemplateParameterLists());
     return getExtInfo()->TemplParamLists[index];
   }
-  void setTemplateParameterListsInfo(unsigned NumTPLists,
+  void setTemplateParameterListsInfo(ASTContext &Context, unsigned NumTPLists,
                                      TemplateParameterList **TPLists) {
-    getExtInfo()->setTemplateParameterListsInfo(NumTPLists, TPLists);
+    getExtInfo()->setTemplateParameterListsInfo(Context, NumTPLists, TPLists);
   }
 
   SourceLocation getTypeSpecStartLoc() const;
@@ -1887,9 +1889,9 @@ public:
     assert(i < getNumTemplateParameterLists());
     return getExtInfo()->TemplParamLists[i];
   }
-  void setTemplateParameterListsInfo(unsigned NumTPLists,
+  void setTemplateParameterListsInfo(ASTContext &Context, unsigned NumTPLists,
                                      TemplateParameterList **TPLists) {
-    getExtInfo()->setTemplateParameterListsInfo(NumTPLists, TPLists);
+    getExtInfo()->setTemplateParameterListsInfo(Context, NumTPLists, TPLists);
   }
 
   // Implement isa/cast/dyncast/etc.
index 4593c6f0e5cedea2de8f5bbbf755a1b0624cc2ca..25687e15c4cfad8dd17e7633a6776bbf7e98ede7 100644 (file)
@@ -567,7 +567,8 @@ void DeclaratorDecl::setQualifierInfo(NestedNameSpecifier *Qualifier,
 }
 
 void
-QualifierInfo::setTemplateParameterListsInfo(unsigned NumTPLists,
+QualifierInfo::setTemplateParameterListsInfo(ASTContext &Context,
+                                             unsigned NumTPLists,
                                              TemplateParameterList **TPLists) {
   assert((NumTPLists == 0 || TPLists != 0) &&
          "Empty array of template parameters with positive size!");
@@ -576,19 +577,25 @@ QualifierInfo::setTemplateParameterListsInfo(unsigned NumTPLists,
 
   // Free previous template parameters (if any).
   if (NumTemplParamLists > 0) {
-    delete[] TemplParamLists;
+    Context.Deallocate(TemplParamLists);
     TemplParamLists = 0;
     NumTemplParamLists = 0;
   }
   // Set info on matched template parameter lists (if any).
   if (NumTPLists > 0) {
-    TemplParamLists = new TemplateParameterList*[NumTPLists];
+    TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
     NumTemplParamLists = NumTPLists;
     for (unsigned i = NumTPLists; i-- > 0; )
       TemplParamLists[i] = TPLists[i];
   }
 }
 
+void QualifierInfo::Destroy(ASTContext &Context) {
+  // FIXME: Deallocate template parameter lists themselves!
+  if (TemplParamLists)
+    Context.Deallocate(TemplParamLists);
+}
+
 //===----------------------------------------------------------------------===//
 // VarDecl Implementation
 //===----------------------------------------------------------------------===//
index 9ba3ee6ca40c8edcb9fcd4c47581cb20c5d2f55d..d1818b813cef1d3435ffa3a0d95cae4a87134fb2 100644 (file)
@@ -2573,7 +2573,8 @@ Sema::ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   SetNestedNameSpecifier(NewVD, D);
 
   if (NumMatchedTemplateParamLists > 0) {
-    NewVD->setTemplateParameterListsInfo(NumMatchedTemplateParamLists,
+    NewVD->setTemplateParameterListsInfo(Context,
+                                         NumMatchedTemplateParamLists,
                         (TemplateParameterList**)TemplateParamLists.release());
   }
 
@@ -3151,7 +3152,8 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   }
 
   if (NumMatchedTemplateParamLists > 0) {
-    NewFD->setTemplateParameterListsInfo(NumMatchedTemplateParamLists,
+    NewFD->setTemplateParameterListsInfo(Context,
+                                         NumMatchedTemplateParamLists,
                         (TemplateParameterList**)TemplateParamLists.release());
   }
 
@@ -5412,7 +5414,8 @@ CreateNewDecl:
         = static_cast<NestedNameSpecifier*>(SS.getScopeRep());
       New->setQualifierInfo(NNS, SS.getRange());
       if (NumMatchedTemplateParamLists > 0) {
-        New->setTemplateParameterListsInfo(NumMatchedTemplateParamLists,
+        New->setTemplateParameterListsInfo(Context,
+                                           NumMatchedTemplateParamLists,
                     (TemplateParameterList**) TemplateParameterLists.release());
       }
     }
index 21d5702ea2531f1112927ff9b2c20062d1115895..234665c4aa7caa045903810b852dcd2de38b8606 100644 (file)
@@ -3868,7 +3868,8 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,
                                                        SequenceNumber);
     SetNestedNameSpecifier(Partial, SS);
     if (NumMatchedTemplateParamLists > 0) {
-      Partial->setTemplateParameterListsInfo(NumMatchedTemplateParamLists,
+      Partial->setTemplateParameterListsInfo(Context,
+                                             NumMatchedTemplateParamLists,
                     (TemplateParameterList**) TemplateParameterLists.release());
     }
 
@@ -3929,8 +3930,8 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,
                                                 PrevDecl);
     SetNestedNameSpecifier(Specialization, SS);
     if (NumMatchedTemplateParamLists > 0) {
-      Specialization->setTemplateParameterListsInfo(
-                    NumMatchedTemplateParamLists,
+      Specialization->setTemplateParameterListsInfo(Context,
+                                                  NumMatchedTemplateParamLists,
                     (TemplateParameterList**) TemplateParameterLists.release());
     }