From: Douglas Gregor Date: Fri, 27 Mar 2009 23:25:45 +0000 (+0000) Subject: Perform a very, very ugly song-and-dance number to free the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e7dcd782df0e1cc3a63e429a866098e69db39153;p=clang 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 --- 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::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 NestedNameSpecs; + { + for (llvm::FoldingSet::iterator + NNS = NestedNameSpecifiers.begin(), + NNSEnd = NestedNameSpecifiers.end(); + NNS != NNSEnd; + ++NNS) + NestedNameSpecs.push_back(&*NNS); + } + NestedNameSpecifiers.clear(); + for (llvm::SmallVector::iterator + NNS = NestedNameSpecs.begin(), + NNSEnd = NestedNameSpecs.end(); + NNS != NNSEnd; + ++NNS) + (*NNS)->Destroy(*this); if (GlobalNestedNameSpecifier) GlobalNestedNameSpecifier->Destroy(*this);