diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 6 | ||||
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 16 |
2 files changed, 7 insertions, 15 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 8167a0f5fa..38b343ffe8 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -3192,9 +3192,10 @@ ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, llvm::SmallVector<NamedDecl *, 64> Decls; // There might be visible decls in multiple parts of the chain, for the TU - // and namespaces. + // and namespaces. For any given name, the last available results replace + // all earlier ones. For this reason, we walk in reverse. DeclContextInfos &Infos = DeclContextOffsets[DC]; - for (DeclContextInfos::iterator I = Infos.begin(), E = Infos.end(); + for (DeclContextInfos::reverse_iterator I = Infos.rbegin(), E = Infos.rend(); I != E; ++I) { if (!I->NameLookupTableData) continue; @@ -3208,6 +3209,7 @@ ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, ASTDeclContextNameLookupTrait::data_type Data = *Pos; for (; Data.first != Data.second; ++Data.first) Decls.push_back(cast<NamedDecl>(GetDecl(*Data.first))); + break; } ++NumVisibleDeclContextsRead; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index dc9f4d409a..43bb7ad4c7 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2101,23 +2101,13 @@ void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) { ASTDeclContextNameLookupTrait Trait(*this); // Create the hash table. - llvm::SmallVector<NamedDecl *, 16> Decls; for (StoredDeclsMap::iterator D = Map->begin(), DEnd = Map->end(); D != DEnd; ++D) { DeclarationName Name = D->first; DeclContext::lookup_result Result = D->second.getLookupResult(); - // Need to filter these results to only include decls that are not from - // an existing PCH. - Decls.clear(); - for (; Result.first != Result.second; ++Result.first) { - if ((*Result.first)->getPCHLevel() == 0) - Decls.push_back(*Result.first); - } - if (!Decls.empty()) { - Result.first = Decls.data(); - Result.second = Result.first + Decls.size(); - Generator.insert(Name, Result, Trait); - } + // For any name that appears in this table, the results are complete, i.e. + // they overwrite results from previous PCHs. Merging is always a mess. + Generator.insert(Name, Result, Trait); } // Create the on-disk hash table in a buffer. |