diff options
Diffstat (limited to 'clang/lib/Serialization')
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 12 |
2 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index a897d868e45..c5153b56729 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -6509,4 +6509,5 @@ ASTReader::~ASTReader() { J != F; ++J) delete J->first; } + assert(RedeclsAddedToAST.empty() && "RedeclsAddedToAST not empty!"); } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 85740de15b5..e770c065199 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -1777,9 +1777,11 @@ ASTDeclReader::FindExistingResult::~FindExistingResult() { DeclContext *DC = New->getDeclContext()->getRedeclContext(); if (DC->isTranslationUnit() && Reader.SemaObj) { - Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, New->getDeclName()); + if (Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, New->getDeclName())) + Reader.RedeclsAddedToAST.insert(New); } else if (DC->isNamespace()) { DC->addDecl(New); + Reader.RedeclsAddedToAST.insert(New); } } @@ -2154,7 +2156,13 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { // AST consumer might need to know about, queue it. // We don't pass it to the consumer immediately because we may be in recursive // loading, and some declarations may still be initializing. - if (isConsumerInterestedIn(D)) + if (getContext().getLangOpts().Modules) { + if (RedeclsAddedToAST.count(D)) { + RedeclsAddedToAST.erase(D); + if (isConsumerInterestedIn(D)) + InterestingDecls.push_back(D); + } + } else if (isConsumerInterestedIn(D)) InterestingDecls.push_back(D); return D; |

