diff options
author | Douglas Gregor <dgregor@apple.com> | 2013-01-07 16:56:53 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2013-01-07 16:56:53 +0000 |
commit | 589dae7d52043af6085967fae0c31d32365de229 (patch) | |
tree | fabd5d233cf3d2f6786e995815009b3b2eaac2df /lib/Serialization/ASTWriter.cpp | |
parent | 7a83421776416d6a9044fb03b5b02208b47646c1 (diff) |
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
Diffstat (limited to 'lib/Serialization/ASTWriter.cpp')
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
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<IdentifierInfo *, 4> 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 |