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
This commit is contained in:
Richard Smith 2014-11-21 05:16:13 +00:00
parent 945d7f58bd
commit e06124799b
1 changed files with 8 additions and 3 deletions

View File

@ -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);
}
}
}
}