diff options
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 8d87d1cb4a2..8d9913b1aae 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -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; |

