fix decl attributes cleaning

this plugs the leak of attributes and also fixes a crash in the test

llvm-svn: 51862
This commit is contained in:
Nuno Lopes
2008-06-01 22:53:53 +00:00
parent 38099c1b6e
commit 3fe4651e2e
4 changed files with 32 additions and 9 deletions

View File

@@ -136,6 +136,7 @@ public:
void addAttr(Attr *attr);
const Attr *getAttrs() const;
void swapAttrs(Decl *D);
void invalidateAttrs();
template<typename T> const T *getAttr() const {
for (const Attr *attr = getAttrs(); attr; attr = attr->getNext())

View File

@@ -336,14 +336,9 @@ Decl::~Decl() {
DeclAttrMapTy::iterator it = DeclAttrs->find(this);
assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!");
// FIXME: Properly release attributes.
// delete it->second;
DeclAttrs->erase(it);
if (DeclAttrs->empty()) {
delete DeclAttrs;
DeclAttrs = 0;
}
// release attributes.
delete it->second;
invalidateAttrs();
}
void Decl::addAttr(Attr *NewAttr) {
@@ -358,6 +353,19 @@ void Decl::addAttr(Attr *NewAttr) {
HasAttrs = true;
}
void Decl::invalidateAttrs() {
if (!HasAttrs) return;
HasAttrs = false;
(*DeclAttrs)[this] = 0;
DeclAttrs->erase(this);
if (DeclAttrs->empty()) {
delete DeclAttrs;
DeclAttrs = 0;
}
}
const Attr *Decl::getAttrs() const {
if (!HasAttrs)
return 0;

View File

@@ -276,7 +276,6 @@ static bool DeclHasAttr(const Decl *decl, const Attr *target) {
static void MergeAttributes(Decl *New, Decl *Old) {
Attr *attr = const_cast<Attr*>(Old->getAttrs()), *tmp;
// FIXME: fix this code to cleanup the Old attrs correctly
while (attr) {
tmp = attr;
attr = attr->getNext();
@@ -288,6 +287,8 @@ static void MergeAttributes(Decl *New, Decl *Old) {
delete(tmp);
}
}
Old->invalidateAttrs();
}
/// MergeFunctionDecl - We just parsed a function 'New' from

View File

@@ -0,0 +1,13 @@
// RUN: clang %s -emit-llvm
void *malloc(int size) __attribute__ ((__nothrow__));
inline static void __zend_malloc() {
malloc(1);
}
void *malloc(int size) __attribute__ ((__nothrow__));
void fontFetch() {
__zend_malloc(1);
}