forked from OSchip/llvm-project
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:
parent
00ea4a36d6
commit
510ee2594e
|
@ -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; }
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue