summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTWriter.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-03-11 00:00:51 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-03-11 00:00:51 +0000
commit9ab4ccecb3981c466951f4ff3f2a788eb1b1a6db (patch)
treedcfbbd543c68e6407a30e862582fb4421bac1c1d /clang/lib/Serialization/ASTWriter.cpp
parentb93fb82b3f8efa33ca1dbb4b47876369cc5297b8 (diff)
downloadbcm5719-llvm-9ab4ccecb3981c466951f4ff3f2a788eb1b1a6db.tar.gz
bcm5719-llvm-9ab4ccecb3981c466951f4ff3f2a788eb1b1a6db.zip
[modules] Fix iterator invalidation issue with names being added to a module
while we're writing out the identifier table. llvm-svn: 231890
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 2e8e590eb53..3f8db194d06 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -4428,16 +4428,19 @@ void ASTWriter::WriteASTCore(Sema &SemaRef,
// Make sure all decls associated with an identifier are registered for
// serialization.
+ llvm::SmallVector<const IdentifierInfo*, 256> IIsToVisit;
for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(),
IDEnd = PP.getIdentifierTable().end();
ID != IDEnd; ++ID) {
const IdentifierInfo *II = ID->second;
- if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization()) {
- for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II),
- DEnd = SemaRef.IdResolver.end();
- D != DEnd; ++D) {
- GetDeclRef(*D);
- }
+ if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization())
+ IIsToVisit.push_back(II);
+ }
+ for (const IdentifierInfo *II : IIsToVisit) {
+ for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II),
+ DEnd = SemaRef.IdResolver.end();
+ D != DEnd; ++D) {
+ GetDeclRef(*D);
}
}
OpenPOWER on IntegriCloud