diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-08-28 09:06:06 +0000 | 
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-08-28 09:06:06 +0000 | 
| commit | 43b205796f4ab57d6175e858f4508f15ee4fcba2 (patch) | |
| tree | a16ebcaa61ddf49cebfe0dcfbbecf727211f9301 /clang/lib/Sema/TreeTransform.h | |
| parent | 1177ff17404eb88809d8b396922b3b4a7832a6d7 (diff) | |
| download | bcm5719-llvm-43b205796f4ab57d6175e858f4508f15ee4fcba2.tar.gz bcm5719-llvm-43b205796f4ab57d6175e858f4508f15ee4fcba2.zip | |
Fix the memory leak of FloatingLiteral/IntegerLiteral.
For large floats/integers, APFloat/APInt will allocate memory from the heap to represent these numbers.
Unfortunately, when we use a BumpPtrAllocator to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with
the APFloat/APInt values will never get freed.
I introduce the class 'APNumericStorage' which uses ASTContext's allocator for memory allocation and is used internally by FloatingLiteral/IntegerLiteral.
Fixes rdar://7637185
llvm-svn: 112361
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 15 | 
1 files changed, 8 insertions, 7 deletions
| diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index dbc02d87272..08cfd68d663 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -5332,10 +5332,10 @@ TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {      } else if (const ConstantArrayType *ConsArrayT                                       = dyn_cast<ConstantArrayType>(ArrayT)) {        ArraySize  -        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral( -                                                  ConsArrayT->getSize(),  -                                                  SemaRef.Context.getSizeType(), -                                                  /*FIXME:*/E->getLocStart())); +        = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context, +                                               ConsArrayT->getSize(),  +                                               SemaRef.Context.getSizeType(), +                                               /*FIXME:*/E->getLocStart()));        AllocType = ConsArrayT->getElementType();      } else if (const DependentSizedArrayType *DepArrayT                                = dyn_cast<DependentSizedArrayType>(ArrayT)) { @@ -6352,7 +6352,8 @@ TreeTransform<Derived>::RebuildArrayType(QualType ElementType,        break;      } -  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); +  IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType, +                           /*FIXME*/BracketsRange.getBegin());    return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,                                  IndexTypeQuals, BracketsRange,                                  getDerived().getBaseEntity()); @@ -6418,8 +6419,8 @@ QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,    llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),                            NumElements, true);    IntegerLiteral *VectorSize -    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, -                                           AttributeLoc); +    = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, +                             AttributeLoc);    return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);  } | 

