From e7dcd782df0e1cc3a63e429a866098e69db39153 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 27 Mar 2009 23:25:45 +0000 Subject: [PATCH] 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 --- lib/AST/ASTContext.cpp | 27 ++++++++++++++++----------- 1 file 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::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); -- 2.40.0