From 394ec984f2048b85abf3ab5eaddc3dd08d2c4d2d Mon Sep 17 00:00:00 2001 From: Nuno Lopes Date: Wed, 17 Dec 2008 23:39:55 +0000 Subject: [PATCH] fix leakage of var's initializers llvm-svn: 61171 --- clang/include/clang/AST/Decl.h | 5 ++++- clang/lib/AST/Decl.cpp | 32 +++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 57b967ec6801..c3589cdfd73b 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/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/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index dcefaa915b7b..be8cbe7344dc 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/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 //===----------------------------------------------------------------------===//