From: Ted Kremenek Date: Wed, 21 May 2008 16:38:54 +0000 (+0000) Subject: Add Destroy method to Types, making there destruction more harmonious with X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b05b1dee6cc65ae61d93dab7edff72710f24589;p=clang Add Destroy method to Types, making there destruction more harmonious with the destruction of Decls and Stmts. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51385 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index 6586366625..431eec03e0 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -244,7 +244,8 @@ protected: Type(TypeClass tc, QualType Canonical) : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical), TC(tc) {} - virtual ~Type(); + virtual ~Type() {}; + virtual void Destroy(ASTContext& C); friend class ASTContext; void EmitTypeInternal(llvm::Serializer& S) const; @@ -722,6 +723,8 @@ class VariableArrayType : public ArrayType { ArraySizeModifier sm, unsigned tq) : ArrayType(VariableArray, et, can, sm, tq), SizeExpr(e) {} friend class ASTContext; // ASTContext creates these. + virtual void Destroy(ASTContext& C); + public: const Expr *getSizeExpr() const { return SizeExpr; } Expr *getSizeExpr() { return SizeExpr; } @@ -916,7 +919,10 @@ class FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { /// ArgInfo - There is an variable size array after the class in memory that /// holds the argument types. + friend class ASTContext; // ASTContext creates these. + virtual void Destroy(ASTContext& C); + public: unsigned getNumArgs() const { return NumArgs; } QualType getArgType(unsigned i) const { diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 3165ad065b..923aab291d 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -29,13 +29,7 @@ enum FloatingRank { ASTContext::~ASTContext() { // Deallocate all the types. while (!Types.empty()) { - if (FunctionTypeProto *FT = dyn_cast(Types.back())) { - // Destroy the object, but don't call delete. These are malloc'd. - FT->~FunctionTypeProto(); - free(FT); - } else { - delete Types.back(); - } + Types.back()->Destroy(*this); Types.pop_back(); } } diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 741d59bc76..e561a1074c 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -22,7 +22,18 @@ #include using namespace clang; -Type::~Type() {} +void Type::Destroy(ASTContext& C) { delete this; } + +void FunctionTypeProto::Destroy(ASTContext& C) { + // Destroy the object, but don't call delete. These are malloc'd. + this->~FunctionTypeProto(); + free(this); +} + +void VariableArrayType::Destroy(ASTContext& C) { + SizeExpr->Destroy(C); + delete this; +} /// isVoidType - Helper method to determine if this is the 'void' type. bool Type::isVoidType() const {