From 0aa22b21cedbe2df87891af02b183d5c29263d39 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 21 Nov 2014 05:16:13 +0000 Subject: [PATCH] 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 --- lib/Serialization/ASTReader.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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); + } + } } } -- 2.50.1