diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-03-27 23:25:45 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-03-27 23:25:45 +0000 |
commit | e7dcd782df0e1cc3a63e429a866098e69db39153 (patch) | |
tree | 62a9941b68a35c22f00640d9792a7ba870425d8a /lib | |
parent | 0773903975631a4baa41e495e8654e2f88a6f3dd (diff) |
Perform a very, very ugly song-and-dance number to free the
NestedNameSpecifiers without causing problems for the FoldingSet that
contains them.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67877 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/ASTContext.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 2956460684..76671576ce 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -78,17 +78,22 @@ ASTContext::~ASTContext() { } // Destroy nested-name-specifiers. - for (llvm::FoldingSet<NestedNameSpecifier>::iterator - NNS = NestedNameSpecifiers.begin(), - NNSEnd = NestedNameSpecifiers.end(); - NNS != NNSEnd; ) { - // This loop iterates, then destroys so that it doesn't cause invalid - // reads. - // FIXME: Find a less fragile way to do this! - NestedNameSpecifier* N = &*NNS; - ++NNS; - N->Destroy(*this); - } + llvm::SmallVector<NestedNameSpecifier *, 16> NestedNameSpecs; + { + for (llvm::FoldingSet<NestedNameSpecifier>::iterator + NNS = NestedNameSpecifiers.begin(), + NNSEnd = NestedNameSpecifiers.end(); + NNS != NNSEnd; + ++NNS) + NestedNameSpecs.push_back(&*NNS); + } + NestedNameSpecifiers.clear(); + for (llvm::SmallVector<NestedNameSpecifier *, 16>::iterator + NNS = NestedNameSpecs.begin(), + NNSEnd = NestedNameSpecs.end(); + NNS != NNSEnd; + ++NNS) + (*NNS)->Destroy(*this); if (GlobalNestedNameSpecifier) GlobalNestedNameSpecifier->Destroy(*this); |