From: Douglas Gregor Date: Mon, 7 Jan 2013 16:56:53 +0000 (+0000) Subject: updateOutOfDateIdentifier() can cause the identifier table to be X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=589dae7d52043af6085967fae0c31d32365de229;p=clang updateOutOfDateIdentifier() can cause the identifier table to be rehashed, invaliding the iterator walking through the identifier table. Separate out the identification of out-of-date identifiers from updating them. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171756 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 58f7fe7051..887876f284 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -3459,11 +3459,19 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, // If there are any out-of-date identifiers, bring them up to date. if (ExternalPreprocessorSource *ExtSource = PP.getExternalSource()) { + // Find out-of-date identifiers. + SmallVector OutOfDate; for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(), IDEnd = PP.getIdentifierTable().end(); - ID != IDEnd; ++ID) + ID != IDEnd; ++ID) { if (ID->second->isOutOfDate()) - ExtSource->updateOutOfDateIdentifier(*ID->second); + OutOfDate.push_back(ID->second); + } + + // Update the out-of-date identifiers. + for (unsigned I = 0, N = OutOfDate.size(); I != N; ++I) { + ExtSource->updateOutOfDateIdentifier(*OutOfDate[I]); + } } // Build a record containing all of the tentative definitions in this file, in