зеркало из https://github.com/microsoft/clang-1.git
add an a Attr::Destroy method and force clients to go through it. As part of
this, make DeclBase::Destroy destroy attributes instead of the DeclBase dtor. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66020 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cdf00290c8
Коммит
cc5814732e
|
@ -20,6 +20,7 @@
|
|||
#include <algorithm>
|
||||
|
||||
namespace clang {
|
||||
class ASTContext;
|
||||
|
||||
/// Attr - This represents one attribute.
|
||||
class Attr {
|
||||
|
@ -69,10 +70,14 @@ private:
|
|||
|
||||
protected:
|
||||
Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {}
|
||||
public:
|
||||
virtual ~Attr() {
|
||||
delete Next;
|
||||
}
|
||||
public:
|
||||
|
||||
void Destroy(ASTContext &C) {
|
||||
delete this;
|
||||
}
|
||||
|
||||
/// \brief Whether this attribute should be merged to new
|
||||
/// declarations.
|
||||
|
|
|
@ -121,15 +121,7 @@ Decl::~Decl() {
|
|||
if (isOutOfSemaDC())
|
||||
delete getMultipleDC();
|
||||
|
||||
if (!HasAttrs)
|
||||
return;
|
||||
|
||||
DeclAttrMapTy::iterator it = DeclAttrs->find(this);
|
||||
assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!");
|
||||
|
||||
// release attributes.
|
||||
delete it->second;
|
||||
invalidateAttrs();
|
||||
assert(!HasAttrs && "attributes should have been freed by Destroy");
|
||||
}
|
||||
|
||||
void Decl::addAttr(Attr *NewAttr) {
|
||||
|
@ -189,7 +181,18 @@ void Decl::swapAttrs(Decl *RHS) {
|
|||
}
|
||||
|
||||
|
||||
void Decl::Destroy(ASTContext& C) {
|
||||
void Decl::Destroy(ASTContext &C) {
|
||||
// Free attributes for this decl.
|
||||
if (HasAttrs) {
|
||||
DeclAttrMapTy::iterator it = DeclAttrs->find(this);
|
||||
assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!");
|
||||
|
||||
// release attributes.
|
||||
it->second->Destroy(C);
|
||||
invalidateAttrs();
|
||||
HasAttrs = false;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// FIXME: Once ownership is fully understood, we can enable this code
|
||||
if (DeclContext *DC = dyn_cast<DeclContext>(this))
|
||||
|
|
|
@ -482,11 +482,11 @@ static bool DeclHasAttr(const Decl *decl, const Attr *target) {
|
|||
}
|
||||
|
||||
/// MergeAttributes - append attributes from the Old decl to the New one.
|
||||
static void MergeAttributes(Decl *New, Decl *Old) {
|
||||
Attr *attr = const_cast<Attr*>(Old->getAttrs()), *tmp;
|
||||
static void MergeAttributes(Decl *New, Decl *Old, ASTContext &C) {
|
||||
Attr *attr = const_cast<Attr*>(Old->getAttrs());
|
||||
|
||||
while (attr) {
|
||||
tmp = attr;
|
||||
Attr *tmp = attr;
|
||||
attr = attr->getNext();
|
||||
|
||||
if (!DeclHasAttr(New, tmp) && tmp->isMerged()) {
|
||||
|
@ -494,7 +494,7 @@ static void MergeAttributes(Decl *New, Decl *Old) {
|
|||
New->addAttr(tmp);
|
||||
} else {
|
||||
tmp->setNext(0);
|
||||
delete(tmp);
|
||||
tmp->Destroy(C);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -678,7 +678,7 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, Decl *OldD) {
|
|||
/// \returns false
|
||||
bool Sema::MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old) {
|
||||
// Merge the attributes
|
||||
MergeAttributes(New, Old);
|
||||
MergeAttributes(New, Old, Context);
|
||||
|
||||
// Merge the storage class.
|
||||
New->setStorageClass(Old->getStorageClass());
|
||||
|
@ -767,7 +767,7 @@ bool Sema::MergeVarDecl(VarDecl *New, Decl *OldD) {
|
|||
return true;
|
||||
}
|
||||
|
||||
MergeAttributes(New, Old);
|
||||
MergeAttributes(New, Old, Context);
|
||||
|
||||
// Merge the types
|
||||
QualType MergedT = Context.mergeTypes(New->getType(), Old->getType());
|
||||
|
|
Загрузка…
Ссылка в новой задаче