diff options
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 3af2a4003ba..c70935c0c7d 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -3663,17 +3663,22 @@ public: } // end anonymous namespace template<typename Visitor> -static void visitLocalLookupResults(const DeclContext *ConstDC, - bool NeedToReconcileExternalVisibleStorage, - Visitor AddLookupResult) { +void ASTWriter::visitLocalLookupResults(const DeclContext *ConstDC, + Visitor AddLookupResult) { // FIXME: We need to build the lookups table, which is logically const. DeclContext *DC = const_cast<DeclContext*>(ConstDC); assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table"); SmallVector<DeclarationName, 16> ExternalNames; for (auto &Lookup : *DC->buildLookup()) { + // If there are no local declarations in our lookup result, we don't + // need to write an entry for the name at all unless we're rewriting + // the decl context. + if (!Lookup.second.hasLocalDecls() && !isRewritten(cast<Decl>(DC))) + continue; + if (Lookup.second.hasExternalDecls() || - NeedToReconcileExternalVisibleStorage) { + DC->NeedToReconcileExternalVisibleStorage) { // We don't know for sure what declarations are found by this name, // because the external source might have a different set from the set // that are in the lookup map, and we can't update it now without @@ -3697,9 +3702,8 @@ static void visitLocalLookupResults(const DeclContext *ConstDC, void ASTWriter::AddUpdatedDeclContext(const DeclContext *DC) { if (UpdatedDeclContexts.insert(DC).second && WritingAST) { // Ensure we emit all the visible declarations. - visitLocalLookupResults(DC, DC->NeedToReconcileExternalVisibleStorage, - [&](DeclarationName Name, - DeclContext::lookup_result Result) { + visitLocalLookupResults(DC, [&](DeclarationName Name, + DeclContext::lookup_result Result) { for (auto *Decl : Result) GetDeclRef(getDeclForLocalLookup(getLangOpts(), Decl)); }); @@ -3721,9 +3725,8 @@ ASTWriter::GenerateNameLookupTable(const DeclContext *DC, SmallVector<NamedDecl *, 8> ConstructorDecls; SmallVector<NamedDecl *, 4> ConversionDecls; - visitLocalLookupResults(DC, DC->NeedToReconcileExternalVisibleStorage, - [&](DeclarationName Name, - DeclContext::lookup_result Result) { + visitLocalLookupResults(DC, [&](DeclarationName Name, + DeclContext::lookup_result Result) { if (Result.empty()) return; |