Invoke destructors in Decl::Destroy().

llvm-svn: 49547
This commit is contained in:
Sam Bishop 2008-04-11 18:04:39 +00:00
parent 305d268ac3
commit ef8b94ae84
4 changed files with 42 additions and 6 deletions

View File

@ -372,6 +372,7 @@ protected:
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 @@ protected:
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 @@ protected:
static TypedefDecl* CreateImpl(llvm::Deserializer& D, ASTContext& C);
friend Decl* Decl::Create(llvm::Deserializer& D, ASTContext& C);
friend void Decl::Destroy(ASTContext& C) const;
};

View File

@ -118,12 +118,10 @@ protected:
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; }

View File

@ -103,7 +103,7 @@ private:
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 @@ public:
// 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:

View File

@ -329,10 +329,43 @@ const Attr *Decl::getAttrs() const {
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
//===----------------------------------------------------------------------===//