PR21323: Fix iterator invalidation issue when looking for redeclarations of a
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 21 Nov 2014 05:16:13 +0000 (05:16 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 21 Nov 2014 05:16:13 +0000 (05:16 +0000)
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

clang/lib/Serialization/ASTReader.cpp

index 1bbadfc..c0f2284 100644 (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);
+        }
+      }
     }
   }