]> granicus.if.org Git - clang/commitdiff
Invoke destructors in Decl::Destroy().
authorSam Bishop <sam@bishop.dhs.org>
Fri, 11 Apr 2008 18:04:39 +0000 (18:04 +0000)
committerSam Bishop <sam@bishop.dhs.org>
Fri, 11 Apr 2008 18:04:39 +0000 (18:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49547 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Decl.h
include/clang/AST/DeclBase.h
include/clang/AST/DeclObjC.h
lib/AST/Decl.cpp

index 019673ab1bd2250f71f37eaf8d86d967ab4a7693..ac08f96508629c34c13a5fa4a4e76df0a458e1ec 100644 (file)
@@ -372,6 +372,7 @@ protected:
   static FunctionDecl* CreateImpl(llvm::Deserializer& D, ASTContext& C);
   
   friend Decl* Decl::Create(llvm::Deserializer& D, ASTContext& C);
+  friend void Decl::Destroy(ASTContext& C) const;
 };
 
 
@@ -452,6 +453,7 @@ protected:
   static EnumConstantDecl* CreateImpl(llvm::Deserializer& D, ASTContext& C);
   
   friend Decl* Decl::Create(llvm::Deserializer& D, ASTContext& C);
+  friend void Decl::Destroy(ASTContext& C) const;
 };
 
 
@@ -504,6 +506,7 @@ protected:
   static TypedefDecl* CreateImpl(llvm::Deserializer& D, ASTContext& C);
   
   friend Decl* Decl::Create(llvm::Deserializer& D, ASTContext& C);
+  friend void Decl::Destroy(ASTContext& C) const;
 };
 
 
index ec3c753051cc3240b39819f81ebac2ac6cff2457..058cb9223ce1858afefbbb912a394839453b453a 100644 (file)
@@ -118,12 +118,10 @@ protected:
     HasAttrs(false) {
     if (Decl::CollectingStats()) addDeclKind(DK);
   }
-  
-public:
-  // TODO: This should probably be made protected once derived classes have
-  // destructors.
+
   virtual ~Decl();
-  
+
+public:
   SourceLocation getLocation() const { return Loc; }
   void setLocation(SourceLocation L) { Loc = L; }
 
index e9d03a1769c14851103a7a4a60c462bb9653e0ec..0efdd2e60d9ba4a0f978551d6b2d6706390b96b5 100644 (file)
@@ -103,7 +103,7 @@ private:
     SelName(SelInfo), MethodDeclType(T), 
     ParamInfo(0), NumMethodParams(0),
     MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
-  virtual ~ObjCMethodDecl();
+  ~ObjCMethodDecl();
 public:
 
   static ObjCMethodDecl *Create(ASTContext &C,
@@ -175,6 +175,8 @@ public:
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) { return D->getKind() == ObjCMethod; }
   static bool classof(const ObjCMethodDecl *D) { return true; }
+
+  friend void Decl::Destroy(ASTContext& C) const;
 };
   
 /// ObjCInterfaceDecl - Represents an ObjC class declaration. For example:
index 43da07cc245d7d71125637e952b605cf1a272e33..c0ec3085e57583faece223c37e3f843fb83f654a 100644 (file)
@@ -329,10 +329,43 @@ const Attr *Decl::getAttrs() const {
   return (*DeclAttrs)[this];
 }
 
+#define CASE(KIND) case KIND: cast<KIND##Decl>(this)->~KIND##Decl(); break
+
 void Decl::Destroy(ASTContext& C) const {
+  switch (getKind()) {
+  CASE(Field);
+  CASE(ObjCIvar);
+  CASE(ObjCCategory);
+  CASE(ObjCCategoryImpl);
+  CASE(ObjCImplementation);
+  CASE(ObjCProtocol);
+  CASE(ObjCProperty);
+  CASE(Typedef);
+  CASE(Enum);
+  CASE(EnumConstant);
+  CASE(Function);
+  CASE(BlockVar);
+  CASE(FileVar);
+  CASE(ParmVar);
+  CASE(ObjCInterface);
+  CASE(ObjCCompatibleAlias);
+  CASE(ObjCMethod);
+  CASE(ObjCClass);
+  CASE(ObjCForwardProtocol);
+  CASE(LinkageSpec);
+
+  case Struct: case Union: case Class:
+    cast<RecordDecl>(this)->~RecordDecl();
+    break;
+
+  default: assert(0 && "Unknown decl kind!");
+  }
+
   C.getAllocator().Deallocate((void *)this);
 }
 
+#undef CASE
+
 //===----------------------------------------------------------------------===//
 // DeclContext Implementation
 //===----------------------------------------------------------------------===//