Invoke destructors in Decl::Destroy().


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49547 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h
index 019673a..ac08f96 100644
--- a/include/clang/AST/Decl.h
+++ b/include/clang/AST/Decl.h
@@ -372,6 +372,7 @@
   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 @@
   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 @@
   static TypedefDecl* CreateImpl(llvm::Deserializer& D, ASTContext& C);
   
   friend Decl* Decl::Create(llvm::Deserializer& D, ASTContext& C);
+  friend void Decl::Destroy(ASTContext& C) const;
 };
 
 
diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h
index ec3c753..058cb92 100644
--- a/include/clang/AST/DeclBase.h
+++ b/include/clang/AST/DeclBase.h
@@ -118,12 +118,10 @@
     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; }
 
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index e9d03a1..0efdd2e 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -103,7 +103,7 @@
     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 @@
   // 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: