diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-03-11 00:00:51 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-03-11 00:00:51 +0000 |
commit | 9ab4ccecb3981c466951f4ff3f2a788eb1b1a6db (patch) | |
tree | dcfbbd543c68e6407a30e862582fb4421bac1c1d /clang/lib/Serialization/ASTWriter.cpp | |
parent | b93fb82b3f8efa33ca1dbb4b47876369cc5297b8 (diff) | |
download | bcm5719-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.cpp | 15 |
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); } } |