Use the allocator associated with ASTContext to allocate the args

array associated with NonNullAttr.  This fixes yet another leak when
ASTContext uses a BumpPtrAllocator.

Fixes: <rdar://problem/7637150>
llvm-svn: 95863
This commit is contained in:
Ted Kremenek 2010-02-11 07:31:47 +00:00
parent 00ea4a36d6
commit 510ee2594e
4 changed files with 21 additions and 15 deletions

View File

@ -361,19 +361,9 @@ class NonNullAttr : public Attr {
unsigned* ArgNums;
unsigned Size;
public:
NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull),
ArgNums(0), Size(0) {
NonNullAttr(ASTContext &C, unsigned* arg_nums = 0, unsigned size = 0);
if (size == 0) return;
assert(arg_nums);
ArgNums = new unsigned[size];
Size = size;
memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
}
virtual ~NonNullAttr() {
delete [] ArgNums;
}
virtual void Destroy(ASTContext &C);
typedef const unsigned *iterator;
iterator begin() const { return ArgNums; }

View File

@ -50,6 +50,22 @@ void FormatAttr::setType(ASTContext &C, llvm::StringRef type) {
ReplaceString(C, type);
}
NonNullAttr::NonNullAttr(ASTContext &C, unsigned* arg_nums, unsigned size)
: Attr(NonNull), ArgNums(0), Size(0) {
if (size == 0)
return;
assert(arg_nums);
ArgNums = new (C) unsigned[size];
Size = size;
memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
}
void NonNullAttr::Destroy(ASTContext &C) {
if (ArgNums)
C.Deallocate(ArgNums);
Attr::Destroy(C);
}
#define DEF_SIMPLE_ATTR_CLONE(ATTR) \
Attr *ATTR##Attr::clone(ASTContext &C) const { \
return ::new (C) ATTR##Attr; \
@ -132,7 +148,7 @@ Attr *SectionAttr::clone(ASTContext &C) const {
}
Attr *NonNullAttr::clone(ASTContext &C) const {
return ::new (C) NonNullAttr(ArgNums, Size);
return ::new (C) NonNullAttr(C, ArgNums, Size);
}
Attr *FormatAttr::clone(ASTContext &C) const {

View File

@ -532,7 +532,7 @@ Attr *PCHReader::ReadAttributes() {
llvm::SmallVector<unsigned, 16> ArgNums;
ArgNums.insert(ArgNums.end(), &Record[Idx], &Record[Idx] + Size);
Idx += Size;
New = ::new (*Context) NonNullAttr(ArgNums.data(), Size);
New = ::new (*Context) NonNullAttr(*Context, ArgNums.data(), Size);
break;
}

View File

@ -307,7 +307,7 @@ static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
unsigned* start = &NonNullArgs[0];
unsigned size = NonNullArgs.size();
std::sort(start, start + size);
d->addAttr(::new (S.Context) NonNullAttr(start, size));
d->addAttr(::new (S.Context) NonNullAttr(S.Context, start, size));
}
static void HandleAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {