From: Richard Smith Date: Fri, 21 Nov 2014 05:16:13 +0000 (+0000) Subject: PR21323: Fix iterator invalidation issue when looking for redeclarations of a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0aa22b21cedbe2df87891af02b183d5c29263d39;p=clang PR21323: Fix iterator invalidation issue when looking for redeclarations of a special member function. No test yet: the only testcases we have for this issue are extremely complex. Testcase will be added once I get a reasonable reduction. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222506 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 1bbadfcee7..c0f2284678 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -6574,9 +6574,14 @@ ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, (Kind == DeclarationName::CXXOperatorName && Name.getCXXOverloadedOperator() == OO_Equal)) { auto Merged = MergedLookups.find(DC); - if (Merged != MergedLookups.end()) - for (auto *MergedDC : Merged->second) - LookUpInContexts(MergedDC); + if (Merged != MergedLookups.end()) { + for (unsigned I = 0; I != Merged->second.size(); ++I) { + LookUpInContexts(Merged->second[I]); + // We might have just added some more merged lookups. If so, our + // iterator is now invalid, so grab a fresh one before continuing. + Merged = MergedLookups.find(DC); + } + } } }