From: Nuno Lopes Date: Wed, 17 Dec 2008 23:39:55 +0000 (+0000) Subject: fix leakage of var's initializers X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=99f06ba988922ea721035a89e6d3c66ba100ba8a;p=clang fix leakage of var's initializers git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61171 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 57b967ec68..c3589cdfd7 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -344,7 +344,10 @@ public: SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, ScopedDecl *PrevDecl, SourceLocation TypeSpecStartLoc = SourceLocation()); - + + virtual ~VarDecl(); + virtual void Destroy(ASTContext& C); + StorageClass getStorageClass() const { return (StorageClass)SClass; } SourceLocation getTypeSpecStartLoc() const { return TypeSpecStartLoc; } diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index dcefaa915b..be8cbe7344 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -14,6 +14,7 @@ #include "clang/AST/Decl.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Stmt.h" +#include "clang/AST/Expr.h" #include "clang/Basic/IdentifierTable.h" using namespace clang; @@ -48,15 +49,6 @@ ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, return new (Mem) ImplicitParamDecl(ImplicitParam, DC, L, Id, T, PrevDecl); } -VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, - SourceLocation L, - IdentifierInfo *Id, QualType T, - StorageClass S, ScopedDecl *PrevDecl, - SourceLocation TypeSpecStartLoc) { - void *Mem = C.getAllocator().Allocate(); - return new (Mem) VarDecl(Var, DC, L, Id, T, S, PrevDecl, TypeSpecStartLoc); -} - ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, @@ -165,6 +157,28 @@ ScopedDecl::~ScopedDecl() { delete getMultipleDC(); } +//===----------------------------------------------------------------------===// +// VarDecl Implementation +//===----------------------------------------------------------------------===// + +VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, + SourceLocation L, + IdentifierInfo *Id, QualType T, + StorageClass S, ScopedDecl *PrevDecl, + SourceLocation TypeSpecStartLoc) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) VarDecl(Var, DC, L, Id, T, S, PrevDecl, TypeSpecStartLoc); +} + +void VarDecl::Destroy(ASTContext& C) { + this->~VarDecl(); + C.getAllocator().Deallocate((void *)this); +} + +VarDecl::~VarDecl() { + delete getInit(); +} + //===----------------------------------------------------------------------===// // FunctionDecl Implementation //===----------------------------------------------------------------------===//