diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 9aa8781592c..75af89ee96a 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -89,13 +89,6 @@ ASTContext::~ASTContext() {        Deallocate(&*I++);      } -    for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator -         I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { -      // Increment in loop to prevent using deallocated memory. -      if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) -        R->Destroy(*this); -    } -      for (llvm::DenseMap<const ObjCContainerDecl*,           const ASTRecordLayout*>::iterator           I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) { @@ -105,6 +98,16 @@ ASTContext::~ASTContext() {      }    } +  // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed +  // even when using the BumpPtrAllocator because they can contain +  // DenseMaps. +  for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator +       I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { +    // Increment in loop to prevent using deallocated memory. +    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) +      R->Destroy(*this); +  } +    // Destroy nested-name-specifiers.    for (llvm::FoldingSet<NestedNameSpecifier>::iterator           NNS = NestedNameSpecifiers.begin(),  | 

