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/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index 43da07c..c0ec308 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -329,10 +329,43 @@
   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
 //===----------------------------------------------------------------------===//