summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-11-21 05:16:13 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-11-21 05:16:13 +0000
commite06124799b20ea006d7c32973c86f961f0dc396f (patch)
tree5e0cdf7dae83ce82ebfffb7fcb0b30d685ece1c8 /clang/lib/Serialization
parent945d7f58bde660b2523945962ec98aa258137d6f (diff)
downloadbcm5719-llvm-e06124799b20ea006d7c32973c86f961f0dc396f.tar.gz
bcm5719-llvm-e06124799b20ea006d7c32973c86f961f0dc396f.zip
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. llvm-svn: 222506
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 1bbadfcee75..c0f22846787 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/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);
+ }
+ }
}
}
OpenPOWER on IntegriCloud