Author: Chuanqi Xu Date: 2025-01-16T10:23:11+08:00 New Revision: 731db2a03e096fe42196f0ae6531179b998b0bf8
URL: https://github.com/llvm/llvm-project/commit/731db2a03e096fe42196f0ae6531179b998b0bf8 DIFF: https://github.com/llvm/llvm-project/commit/731db2a03e096fe42196f0ae6531179b998b0bf8.diff LOG: Revert "[C++20] [Modules] Support module level lookup (#122887)" This reverts commit 7201cae106260aeb3e9bbbb7d5291ff30f05076a. Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/AST/DeclBase.h clang/include/clang/AST/ExternalASTMerger.h clang/include/clang/AST/ExternalASTSource.h clang/include/clang/Sema/MultiplexExternalSemaSource.h clang/include/clang/Serialization/ASTBitCodes.h clang/include/clang/Serialization/ASTReader.h clang/include/clang/Serialization/ASTWriter.h clang/lib/AST/DeclBase.cpp clang/lib/AST/ExternalASTMerger.cpp clang/lib/AST/ExternalASTSource.cpp clang/lib/Interpreter/CodeCompletion.cpp clang/lib/Sema/MultiplexExternalSemaSource.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTReaderDecl.cpp clang/lib/Serialization/ASTReaderInternals.h clang/lib/Serialization/ASTWriter.cpp clang/lib/Serialization/ASTWriterDecl.cpp clang/test/CXX/basic/basic.scope/basic.scope.namespace/p2.cpp clang/test/CXX/module/basic/basic.link/p2.cppm clang/test/CXX/module/module.import/p2.cpp clang/test/CXX/module/module.interface/p7.cpp clang/test/CXX/module/module.reach/p5.cpp clang/test/Modules/Reachability-template-default-arg.cpp clang/test/Modules/cxx20-10-1-ex2.cpp clang/test/Modules/deduction-guide3.cppm clang/unittests/AST/ExternalASTSourceTest.cpp lldb/source/Plugins/ExpressionParser/Clang/ASTUtils.h lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp Removed: clang/test/Modules/module-local-with-templates.cppm clang/test/Modules/pr90154.cppm ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index c6bc95594f6133..6ac91f43e66d8b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -316,8 +316,6 @@ C++23 Feature Support C++20 Feature Support ^^^^^^^^^^^^^^^^^^^^^ -- Implemented module level lookup for C++20 modules. (#GH90154) - Resolutions to C++ Defect Reports ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 91177c9a4b51fa..71ab9178509b2f 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -836,10 +836,6 @@ class alignas(8) Decl { return isFromASTFile() ? getImportedOwningModule() : getLocalOwningModule(); } - /// Get the top level owning named module that owns this declaration if any. - /// \returns nullptr if the declaration is not owned by a named module. - Module *getTopLevelOwningNamedModule() const; - /// Get the module that owns this declaration for linkage purposes. /// There only ever is such a standard C++ module. Module *getOwningModuleForLinkage() const; @@ -2726,12 +2722,6 @@ class DeclContext { bool Deserialize = false) const; private: - /// Lookup all external visible declarations and the external declarations - /// within the same module specified by \c NamedModule. We can't - /// get it from \c this since the same declaration may be declared in - /// multiple modules. e.g., namespace. - lookup_result lookupImpl(DeclarationName Name, Module *NamedModule) const; - /// Whether this declaration context has had externally visible /// storage added since the last lookup. In this case, \c LookupPtr's /// invariant may not hold and needs to be fixed before we perform diff --git a/clang/include/clang/AST/ExternalASTMerger.h b/clang/include/clang/AST/ExternalASTMerger.h index 46f187c5e06948..ec4cfbe2175c02 100644 --- a/clang/include/clang/AST/ExternalASTMerger.h +++ b/clang/include/clang/AST/ExternalASTMerger.h @@ -141,8 +141,7 @@ class ExternalASTMerger : public ExternalASTSource { /// Implementation of the ExternalASTSource API. bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) override; + DeclarationName Name) override; /// Implementation of the ExternalASTSource API. void diff --git a/clang/include/clang/AST/ExternalASTSource.h b/clang/include/clang/AST/ExternalASTSource.h index ee4ad634977dc2..4d7ff822fceb75 100644 --- a/clang/include/clang/AST/ExternalASTSource.h +++ b/clang/include/clang/AST/ExternalASTSource.h @@ -51,7 +51,6 @@ class RecordDecl; class Selector; class Stmt; class TagDecl; -class Module; /// Abstract interface for external sources of AST nodes. /// @@ -146,20 +145,12 @@ class ExternalASTSource : public RefCountedBase<ExternalASTSource> { /// Find all declarations with the given name in the given context, /// and add them to the context by calling SetExternalVisibleDeclsForName /// or SetNoExternalVisibleDeclsForName. - /// \param DC the context for lookup. - /// \param Name the name of the declarations to find. - /// \param NamedModule find declarations visible to the given module - /// \c NamedModule . This may be diff erent from owning module of \c DC since - /// there are declarations (e.g., namespace declaration) can appear in - /// multiple modules. - /// - /// \return \c true if any declarations might have been found, and \c false - /// if we definitely have no declarations with this name. + /// \return \c true if any declarations might have been found, \c false if + /// we definitely have no declarations with tbis name. /// /// The default implementation of this method is a no-op returning \c false. - virtual bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule); + virtual bool + FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name); /// Load all the external specializations for the Decl \param D if \param /// OnlyPartial is false. Otherwise, load all the external **partial** diff --git a/clang/include/clang/Sema/MultiplexExternalSemaSource.h b/clang/include/clang/Sema/MultiplexExternalSemaSource.h index 08d6143f7caaf3..0c92c52854c9e7 100644 --- a/clang/include/clang/Sema/MultiplexExternalSemaSource.h +++ b/clang/include/clang/Sema/MultiplexExternalSemaSource.h @@ -95,8 +95,7 @@ class MultiplexExternalSemaSource : public ExternalSemaSource { /// Find all declarations with the given name in the /// given context. bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) override; + DeclarationName Name) override; bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override; diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index 40dae25f7b54b7..aac165130b7192 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -738,8 +738,6 @@ enum ASTRecordTypes { CXX_ADDED_TEMPLATE_SPECIALIZATION = 74, CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION = 75, - - UPDATE_MODULE_LOCAL_VISIBLE = 76, }; /// Record types used within a source manager block. @@ -1336,10 +1334,6 @@ enum DeclCode { /// into a DeclContext via DeclContext::lookup. DECL_CONTEXT_VISIBLE, - /// A record containing the set of declarations that are - /// only visible from DeclContext in the same module. - DECL_CONTEXT_MODULE_LOCAL_VISIBLE, - /// A LabelDecl record. DECL_LABEL, diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index ea12adaec3ee81..9f978762a6fb6b 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -353,7 +353,6 @@ class ASTIdentifierLookupTrait; /// The on-disk hash table(s) used for DeclContext name lookup. struct DeclContextLookupTable; -struct ModuleLocalLookupTable; /// The on-disk hash table(s) used for specialization decls. struct LazySpecializationInfoLookupTable; @@ -524,14 +523,9 @@ class ASTReader /// in the chain. DeclUpdateOffsetsMap DeclUpdateOffsets; - struct LookupBlockOffsets { - uint64_t LexicalOffset; - uint64_t VisibleOffset; - uint64_t ModuleLocalOffset; - }; - using DelayedNamespaceOffsetMapTy = - llvm::DenseMap<GlobalDeclID, LookupBlockOffsets>; + llvm::DenseMap<GlobalDeclID, std::pair</*LexicalOffset*/ uint64_t, + /*VisibleOffset*/ uint64_t>>; /// Mapping from global declaration IDs to the lexical and visible block /// offset for delayed namespace in reduced BMI. @@ -637,9 +631,6 @@ class ASTReader /// Map from a DeclContext to its lookup tables. llvm::DenseMap<const DeclContext *, serialization::reader::DeclContextLookupTable> Lookups; - llvm::DenseMap<const DeclContext *, - serialization::reader::ModuleLocalLookupTable> - ModuleLocalLookups; using SpecLookupTableTy = llvm::DenseMap<const Decl *, @@ -668,8 +659,6 @@ class ASTReader /// Updates to the visible declarations of declaration contexts that /// haven't been loaded yet. llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> PendingVisibleUpdates; - llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> - PendingModuleLocalVisibleUpdates; using SpecializationsUpdate = SmallVector<UpdateData, 1>; using SpecializationsUpdateMap = @@ -707,8 +696,7 @@ class ASTReader /// Read the record that describes the visible contents of a DC. bool ReadVisibleDeclContextStorage(ModuleFile &M, llvm::BitstreamCursor &Cursor, - uint64_t Offset, GlobalDeclID ID, - bool IsModuleLocal); + uint64_t Offset, GlobalDeclID ID); bool ReadSpecializations(ModuleFile &M, llvm::BitstreamCursor &Cursor, uint64_t Offset, Decl *D, bool IsPartial); @@ -1144,10 +1132,6 @@ class ASTReader /// Number of visible decl contexts read/total. unsigned NumVisibleDeclContextsRead = 0, TotalVisibleDeclContexts = 0; - /// Number of module local visible decl contexts read/total. - unsigned NumModuleLocalVisibleDeclContexts = 0, - TotalModuleLocalVisibleDeclContexts = 0; - /// Total size of modules, in bits, currently loaded uint64_t TotalModulesSizeInBits = 0; @@ -1460,9 +1444,6 @@ class ASTReader const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const; - const serialization::reader::ModuleLocalLookupTable * - getModuleLocalLookupTables(DeclContext *Primary) const; - /// Get the loaded specializations lookup tables for \p D, /// if any. serialization::reader::LazySpecializationInfoLookupTable * @@ -2138,8 +2119,7 @@ class ASTReader /// The current implementation of this method just loads the entire /// lookup table as unmaterialized references. bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) override; + DeclarationName Name) override; /// Read all of the declarations lexically stored in a /// declaration context. @@ -2627,10 +2607,6 @@ inline bool shouldSkipCheckingODR(const Decl *D) { (D->isFromGlobalModule() || D->isFromHeaderUnit()); } -/// Calculate a hash value for the primary module name of the given module. -/// \returns std::nullopt if M is not a C++ standard module. -std::optional<unsigned> getPrimaryModuleHash(const Module *M); - } // namespace clang #endif // LLVM_CLANG_SERIALIZATION_ASTREADER_H diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index 53b09cc914392e..adb7cce522a803 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -492,10 +492,6 @@ class ASTWriter : public ASTDeserializationListener, /// file. unsigned NumVisibleDeclContexts = 0; - /// The number of module local visible declcontexts written to the AST - /// file. - unsigned NumModuleLocalDeclContexts = 0; - /// A mapping from each known submodule to its ID number, which will /// be a positive integer. llvm::DenseMap<const Module *, unsigned> SubmoduleIDs; @@ -591,15 +587,11 @@ class ASTWriter : public ASTDeserializationListener, uint64_t WriteSpecializationInfoLookupTable( const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations, bool IsPartial); - void - GenerateNameLookupTable(ASTContext &Context, const DeclContext *DC, - llvm::SmallVectorImpl<char> &LookupTable, - llvm::SmallVectorImpl<char> &ModuleLocalLookupTable); + void GenerateNameLookupTable(ASTContext &Context, const DeclContext *DC, + llvm::SmallVectorImpl<char> &LookupTable); uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, const DeclContext *DC); - void WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC, - uint64_t &VisibleBlockOffset, - uint64_t &ModuleLocalBlockOffset); + uint64_t WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC); void WriteTypeDeclOffsets(); void WriteFileDeclIDsMap(); void WriteComments(ASTContext &Context); @@ -632,9 +624,7 @@ class ASTWriter : public ASTDeserializationListener, unsigned DeclParmVarAbbrev = 0; unsigned DeclContextLexicalAbbrev = 0; unsigned DeclContextVisibleLookupAbbrev = 0; - unsigned DeclModuleLocalVisibleLookupAbbrev = 0; unsigned UpdateVisibleAbbrev = 0; - unsigned ModuleLocalUpdateVisibleAbbrev = 0; unsigned DeclRecordAbbrev = 0; unsigned DeclTypedefAbbrev = 0; unsigned DeclVarAbbrev = 0; diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index 42daaa4f3dcc37..fb701f76231bcd 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -1850,28 +1850,15 @@ void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) { } } -Module *Decl::getTopLevelOwningNamedModule() const { - if (getOwningModule() && - getOwningModule()->getTopLevelModule()->isNamedModule()) - return getOwningModule()->getTopLevelModule(); - - return nullptr; -} - DeclContext::lookup_result DeclContext::lookup(DeclarationName Name) const { - return lookupImpl(Name, cast<Decl>(this)->getTopLevelOwningNamedModule()); -} - -DeclContext::lookup_result DeclContext::lookupImpl(DeclarationName Name, - Module *NamedModule) const { // For transparent DeclContext, we should lookup in their enclosing context. if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export) - return getParent()->lookupImpl(Name, NamedModule); + return getParent()->lookup(Name); const DeclContext *PrimaryContext = getPrimaryContext(); if (PrimaryContext != this) - return PrimaryContext->lookupImpl(Name, NamedModule); + return PrimaryContext->lookup(Name); // If we have an external source, ensure that any later redeclarations of this // context have been loaded, since they may add names to the result of this @@ -1902,8 +1889,7 @@ DeclContext::lookup_result DeclContext::lookupImpl(DeclarationName Name, if (!R.second && !R.first->second.hasExternalDecls()) return R.first->second.getLookupResult(); - if (Source->FindExternalVisibleDeclsByName(this, Name, NamedModule) || - !R.second) { + if (Source->FindExternalVisibleDeclsByName(this, Name) || !R.second) { if (StoredDeclsMap *Map = LookupPtr) { StoredDeclsMap::iterator I = Map->find(Name); if (I != Map->end()) @@ -2129,8 +2115,7 @@ void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) { if (ExternalASTSource *Source = getParentASTContext().getExternalSource()) if (hasExternalVisibleStorage() && Map->find(D->getDeclName()) == Map->end()) - Source->FindExternalVisibleDeclsByName( - this, D->getDeclName(), D->getTopLevelOwningNamedModule()); + Source->FindExternalVisibleDeclsByName(this, D->getDeclName()); // Insert this declaration into the map. StoredDeclsList &DeclNameEntries = (*Map)[D->getDeclName()]; diff --git a/clang/lib/AST/ExternalASTMerger.cpp b/clang/lib/AST/ExternalASTMerger.cpp index a33f6e3447679c..7f7816e1b10eae 100644 --- a/clang/lib/AST/ExternalASTMerger.cpp +++ b/clang/lib/AST/ExternalASTMerger.cpp @@ -472,8 +472,7 @@ static bool importSpecializationsIfNeeded(Decl *D, ASTImporter *Importer) { } bool ExternalASTMerger::FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) { + DeclarationName Name) { llvm::SmallVector<NamedDecl *, 1> Decls; llvm::SmallVector<Candidate, 4> Candidates; diff --git a/clang/lib/AST/ExternalASTSource.cpp b/clang/lib/AST/ExternalASTSource.cpp index 4a29f4944f73c0..543846c0093af8 100644 --- a/clang/lib/AST/ExternalASTSource.cpp +++ b/clang/lib/AST/ExternalASTSource.cpp @@ -90,9 +90,9 @@ ExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) { return nullptr; } -bool ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) { +bool +ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC, + DeclarationName Name) { return false; } diff --git a/clang/lib/Interpreter/CodeCompletion.cpp b/clang/lib/Interpreter/CodeCompletion.cpp index 9092d4705ca58a..bbc8830d76bc00 100644 --- a/clang/lib/Interpreter/CodeCompletion.cpp +++ b/clang/lib/Interpreter/CodeCompletion.cpp @@ -228,8 +228,7 @@ class ExternalSource : public clang::ExternalASTSource { ExternalSource(ASTContext &ChildASTCtxt, FileManager &ChildFM, ASTContext &ParentASTCtxt, FileManager &ParentFM); bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) override; + DeclarationName Name) override; void completeVisibleDeclsMap(const clang::DeclContext *childDeclContext) override; }; @@ -272,8 +271,7 @@ ExternalSource::ExternalSource(ASTContext &ChildASTCtxt, FileManager &ChildFM, } bool ExternalSource::FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) { + DeclarationName Name) { IdentifierTable &ParentIdTable = ParentASTCtxt.Idents; diff --git a/clang/lib/Sema/MultiplexExternalSemaSource.cpp b/clang/lib/Sema/MultiplexExternalSemaSource.cpp index c19a0f980c1e9a..54944267b4868a 100644 --- a/clang/lib/Sema/MultiplexExternalSemaSource.cpp +++ b/clang/lib/Sema/MultiplexExternalSemaSource.cpp @@ -107,12 +107,11 @@ MultiplexExternalSemaSource::hasExternalDefinitions(const Decl *D) { return EK_ReplyHazy; } -bool MultiplexExternalSemaSource::FindExternalVisibleDeclsByName( - const DeclContext *DC, DeclarationName Name, Module *NamedModule) { +bool MultiplexExternalSemaSource:: +FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { bool AnyDeclsFound = false; for (size_t i = 0; i < Sources.size(); ++i) - AnyDeclsFound |= - Sources[i]->FindExternalVisibleDeclsByName(DC, Name, NamedModule); + AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name); return AnyDeclsFound; } diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 06853a227215e0..7361cace49dd7b 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1235,7 +1235,7 @@ unsigned DeclarationNameKey::getHash() const { } ModuleFile * -ASTDeclContextNameLookupTraitBase::ReadFileRef(const unsigned char *&d) { +ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { using namespace llvm::support; uint32_t ModuleFileID = @@ -1244,12 +1244,12 @@ ASTDeclContextNameLookupTraitBase::ReadFileRef(const unsigned char *&d) { } std::pair<unsigned, unsigned> -ASTDeclContextNameLookupTraitBase::ReadKeyDataLength(const unsigned char *&d) { +ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { return readULEBKeyDataLength(d); } -DeclarationNameKey -ASTDeclContextNameLookupTraitBase::ReadKeyBase(const unsigned char *&d) { +ASTDeclContextNameLookupTrait::internal_key_type +ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { using namespace llvm::support; auto Kind = (DeclarationName::NameKind)*d++; @@ -1283,13 +1283,10 @@ ASTDeclContextNameLookupTraitBase::ReadKeyBase(const unsigned char *&d) { return DeclarationNameKey(Kind, Data); } -ASTDeclContextNameLookupTrait::internal_key_type -ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { - return ReadKeyBase(d); -} - -void ASTDeclContextNameLookupTraitBase::ReadDataIntoImpl( - const unsigned char *d, unsigned DataLen, data_type_builder &Val) { +void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, + const unsigned char *d, + unsigned DataLen, + data_type_builder &Val) { using namespace llvm::support; for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) { @@ -1299,47 +1296,6 @@ void ASTDeclContextNameLookupTraitBase::ReadDataIntoImpl( } } -void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, - const unsigned char *d, - unsigned DataLen, - data_type_builder &Val) { - ReadDataIntoImpl(d, DataLen, Val); -} - -ModuleLocalNameLookupTrait::hash_value_type -ModuleLocalNameLookupTrait::ComputeHash(const internal_key_type &Key) { - llvm::FoldingSetNodeID ID; - ID.AddInteger(Key.first.getHash()); - ID.AddInteger(Key.second); - return ID.computeStableHash(); -} - -ModuleLocalNameLookupTrait::internal_key_type -ModuleLocalNameLookupTrait::GetInternalKey(const external_key_type &Key) { - DeclarationNameKey Name(Key.first); - - std::optional<unsigned> ModuleHash = getPrimaryModuleHash(Key.second); - if (!ModuleHash) - return {Name, 0}; - - return {Name, *ModuleHash}; -} - -ModuleLocalNameLookupTrait::internal_key_type -ModuleLocalNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { - DeclarationNameKey Name = ReadKeyBase(d); - unsigned PrimaryModuleHash = - llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d); - return {Name, PrimaryModuleHash}; -} - -void ModuleLocalNameLookupTrait::ReadDataInto(internal_key_type, - const unsigned char *d, - unsigned DataLen, - data_type_builder &Val) { - ReadDataIntoImpl(d, DataLen, Val); -} - ModuleFile * LazySpecializationInfoLookupTrait::ReadFileRef(const unsigned char *&d) { using namespace llvm::support; @@ -1427,8 +1383,8 @@ bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, BitstreamCursor &Cursor, - uint64_t Offset, GlobalDeclID ID, - bool IsModuleLocal) { + uint64_t Offset, + GlobalDeclID ID) { assert(Offset != 0); SavedStreamPosition SavedPosition(Cursor); @@ -1452,22 +1408,15 @@ bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, return true; } unsigned RecCode = MaybeRecCode.get(); - if (!IsModuleLocal && RecCode != DECL_CONTEXT_VISIBLE) { + if (RecCode != DECL_CONTEXT_VISIBLE) { Error("Expected visible lookup table block"); return true; } - if (IsModuleLocal && RecCode != DECL_CONTEXT_MODULE_LOCAL_VISIBLE) { - Error("Expected module local visible lookup table block"); - return true; - } // We can't safely determine the primary context yet, so delay attaching the // lookup table until we're done with recursive deserialization. auto *Data = (const unsigned char*)Blob.data(); - if (!IsModuleLocal) - PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data}); - else - PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&M, Data}); + PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data}); return false; } @@ -3600,19 +3549,6 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; } - case UPDATE_MODULE_LOCAL_VISIBLE: { - unsigned Idx = 0; - GlobalDeclID ID = ReadDeclID(F, Record, Idx); - auto *Data = (const unsigned char *)Blob.data(); - PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&F, Data}); - // If we've already loaded the decl, perform the updates when we finish - // loading this block. - if (Decl *D = GetExistingDecl(ID)) - PendingUpdateRecords.push_back( - PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); - break; - } - case CXX_ADDED_TEMPLATE_SPECIALIZATION: { unsigned Idx = 0; GlobalDeclID ID = ReadDeclID(F, Record, Idx); @@ -3716,7 +3652,6 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, TotalNumMacros += Record[1]; TotalLexicalDeclContexts += Record[2]; TotalVisibleDeclContexts += Record[3]; - TotalModuleLocalVisibleDeclContexts += Record[4]; break; case UNUSED_FILESCOPED_DECLS: @@ -4002,7 +3937,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD: { - if (Record.size() % 4 != 0) + if (Record.size() % 3 != 0) return llvm::createStringError( std::errc::illegal_byte_sequence, "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST " @@ -4018,12 +3953,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, uint64_t LocalVisibleOffset = Record[I++]; uint64_t VisibleOffset = LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0; - uint64_t LocalModuleLocalOffset = Record[I++]; - uint64_t ModuleLocalOffset = - LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0; - DelayedNamespaceOffsetMap[ID] = {LexicalOffset, VisibleOffset, - ModuleLocalOffset}; + DelayedNamespaceOffsetMap[ID] = {LexicalOffset, VisibleOffset}; assert(!GetExistingDecl(ID) && "We shouldn't load the namespace in the front of delayed " @@ -8435,42 +8366,31 @@ void ASTReader::FindFileRegionDecls(FileID File, *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt)))); } -bool ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name, - Module *NamedModule) { +bool +ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, + DeclarationName Name) { assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && "DeclContext has no visible decls in storage"); if (!Name) return false; - // Load the list of declarations. - SmallVector<NamedDecl *, 64> Decls; - llvm::SmallPtrSet<NamedDecl *, 8> Found; + auto It = Lookups.find(DC); + if (It == Lookups.end()) + return false; Deserializing LookupResults(this); - // FIXME: Clear the redundancy with templated lambda in C++20 when that's - // available. - if (auto It = Lookups.find(DC); It != Lookups.end()) { - ++NumVisibleDeclContextsRead; - for (GlobalDeclID ID : It->second.Table.find(Name)) { - NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); - if (ND->getDeclName() == Name && Found.insert(ND).second) - Decls.push_back(ND); - } - } + // Load the list of declarations. + SmallVector<NamedDecl *, 64> Decls; + llvm::SmallPtrSet<NamedDecl *, 8> Found; - if (NamedModule) { - if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) { - ++NumModuleLocalVisibleDeclContexts; - for (GlobalDeclID ID : It->second.Table.find({Name, NamedModule})) { - NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); - if (ND->getDeclName() == Name && Found.insert(ND).second) - Decls.push_back(ND); - } - } + for (GlobalDeclID ID : It->second.Table.find(Name)) { + NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); + if (ND->getDeclName() == Name && Found.insert(ND).second) + Decls.push_back(ND); } + ++NumVisibleDeclContextsRead; SetExternalVisibleDeclsForName(DC, Name, Decls); return !Decls.empty(); } @@ -8479,25 +8399,18 @@ void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { if (!DC->hasExternalVisibleStorage()) return; - DeclsMap Decls; - - auto findAll = [&](auto &LookupTables, unsigned &NumRead) { - auto It = LookupTables.find(DC); - if (It == LookupTables.end()) - return; - - NumRead++; + auto It = Lookups.find(DC); + assert(It != Lookups.end() && + "have external visible storage but no lookup tables"); - for (GlobalDeclID ID : It->second.Table.findAll()) { - NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); - Decls[ND->getDeclName()].push_back(ND); - } + DeclsMap Decls; - // FIXME: Why a PCH test is failing if we remove the iterator after findAll? - }; + for (GlobalDeclID ID : It->second.Table.findAll()) { + NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); + Decls[ND->getDeclName()].push_back(ND); + } - findAll(Lookups, NumVisibleDeclContextsRead); - findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts); + ++NumVisibleDeclContextsRead; for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { SetExternalVisibleDeclsForName(DC, I->first, I->second); @@ -8511,12 +8424,6 @@ ASTReader::getLoadedLookupTables(DeclContext *Primary) const { return I == Lookups.end() ? nullptr : &I->second; } -const serialization::reader::ModuleLocalLookupTable * -ASTReader::getModuleLocalLookupTables(DeclContext *Primary) const { - auto I = ModuleLocalLookups.find(Primary); - return I == ModuleLocalLookups.end() ? nullptr : &I->second; -} - serialization::reader::LazySpecializationInfoLookupTable * ASTReader::getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial) { assert(D->isCanonicalDecl()); @@ -8626,12 +8533,6 @@ void ASTReader::PrintStats() { NumVisibleDeclContextsRead, TotalVisibleDeclContexts, ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts * 100)); - if (TotalModuleLocalVisibleDeclContexts) - std::fprintf( - stderr, " %u/%u module local visible declcontexts read (%f%%)\n", - NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts, - ((float)NumModuleLocalVisibleDeclContexts / - TotalModuleLocalVisibleDeclContexts * 100)); if (TotalNumMethodPoolEntries) std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, @@ -12738,25 +12639,3 @@ void ASTRecordReader::readOpenACCClauseList( for (unsigned I = 0; I < Clauses.size(); ++I) Clauses[I] = readOpenACCClause(); } - -static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) { - // TODO: Maybe it is better to check PrimaryModuleName is a valid - // module name? - llvm::FoldingSetNodeID ID; - ID.AddString(PrimaryModuleName); - return ID.computeStableHash(); -} - -std::optional<unsigned> clang::getPrimaryModuleHash(const Module *M) { - if (!M) - return std::nullopt; - - if (M->isHeaderLikeModule()) - return std::nullopt; - - if (M->isGlobalModule()) - return std::nullopt; - - StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName(); - return getStableHashForModuleName(PrimaryModuleName); -} diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 1c51a7b5e460f6..95abd75920c8fe 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -413,8 +413,7 @@ class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> { void VisitEmptyDecl(EmptyDecl *D); void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D); - void VisitDeclContext(DeclContext *DC, uint64_t &LexicalOffset, - uint64_t &VisibleOffset, uint64_t &ModuleLocalOffset); + std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC); template <typename T> RedeclarableResult VisitRedeclarable(Redeclarable<T> *D); @@ -1856,10 +1855,7 @@ void ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) { void ASTDeclReader::VisitHLSLBufferDecl(HLSLBufferDecl *D) { VisitNamedDecl(D); - uint64_t LexicalOffset = 0; - uint64_t VisibleOffset = 0; - uint64_t ModuleLocalOffset = 0; - VisitDeclContext(D, LexicalOffset, VisibleOffset, ModuleLocalOffset); + VisitDeclContext(D); D->IsCBuffer = Record.readBool(); D->KwLoc = readSourceLocation(); D->LBraceLoc = readSourceLocation(); @@ -2768,12 +2764,11 @@ void ASTDeclReader::VisitLifetimeExtendedTemporaryDecl( mergeMergeable(D); } -void ASTDeclReader::VisitDeclContext(DeclContext *DC, uint64_t &LexicalOffset, - uint64_t &VisibleOffset, - uint64_t &ModuleLocalOffset) { - LexicalOffset = ReadLocalOffset(); - VisibleOffset = ReadLocalOffset(); - ModuleLocalOffset = ReadLocalOffset(); +std::pair<uint64_t, uint64_t> +ASTDeclReader::VisitDeclContext(DeclContext *DC) { + uint64_t LexicalOffset = ReadLocalOffset(); + uint64_t VisibleOffset = ReadLocalOffset(); + return std::make_pair(LexicalOffset, VisibleOffset); } template <typename T> @@ -3874,7 +3869,6 @@ Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) { switch ((DeclCode)MaybeDeclCode.get()) { case DECL_CONTEXT_LEXICAL: case DECL_CONTEXT_VISIBLE: - case DECL_CONTEXT_MODULE_LOCAL_VISIBLE: case DECL_SPECIALIZATIONS: case DECL_PARTIAL_SPECIALIZATIONS: llvm_unreachable("Record cannot be de-serialized with readDeclRecord"); @@ -4182,35 +4176,21 @@ Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) { // If this declaration is also a declaration context, get the // offsets for its tables of lexical and visible declarations. if (auto *DC = dyn_cast<DeclContext>(D)) { - uint64_t LexicalOffset = 0; - uint64_t VisibleOffset = 0; - uint64_t ModuleLocalOffset = 0; - - Reader.VisitDeclContext(DC, LexicalOffset, VisibleOffset, - ModuleLocalOffset); + std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC); // Get the lexical and visible block for the delayed namespace. // It is sufficient to judge if ID is in DelayedNamespaceOffsetMap. // But it may be more efficient to filter the other cases. - if (!LexicalOffset && !VisibleOffset && !ModuleLocalOffset && - isa<NamespaceDecl>(D)) + if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(D)) if (auto Iter = DelayedNamespaceOffsetMap.find(ID); - Iter != DelayedNamespaceOffsetMap.end()) { - LexicalOffset = Iter->second.LexicalOffset; - VisibleOffset = Iter->second.VisibleOffset; - ModuleLocalOffset = Iter->second.ModuleLocalOffset; - } + Iter != DelayedNamespaceOffsetMap.end()) + Offsets = Iter->second; - if (LexicalOffset && - ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor, LexicalOffset, DC)) - return nullptr; - if (VisibleOffset && - ReadVisibleDeclContextStorage(*Loc.F, DeclsCursor, VisibleOffset, ID, - /*IsModuleLocal=*/false)) + if (Offsets.first && + ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor, Offsets.first, DC)) return nullptr; - if (ModuleLocalOffset && - ReadVisibleDeclContextStorage(*Loc.F, DeclsCursor, ModuleLocalOffset, - ID, /*IsModuleLocal=*/true)) + if (Offsets.second && + ReadVisibleDeclContextStorage(*Loc.F, DeclsCursor, Offsets.second, ID)) return nullptr; } assert(Record.getIdx() == Record.size()); @@ -4348,8 +4328,8 @@ void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) { } // Load the pending visible updates for this decl context, if it has any. - if (auto I = PendingVisibleUpdates.find(ID); - I != PendingVisibleUpdates.end()) { + auto I = PendingVisibleUpdates.find(ID); + if (I != PendingVisibleUpdates.end()) { auto VisibleUpdates = std::move(I->second); PendingVisibleUpdates.erase(I); @@ -4361,21 +4341,6 @@ void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) { DC->setHasExternalVisibleStorage(true); } - if (auto I = PendingModuleLocalVisibleUpdates.find(ID); - I != PendingModuleLocalVisibleUpdates.end()) { - auto ModuleLocalVisibleUpdates = std::move(I->second); - PendingModuleLocalVisibleUpdates.erase(I); - - auto *DC = cast<DeclContext>(D)->getPrimaryContext(); - for (const auto &Update : ModuleLocalVisibleUpdates) - ModuleLocalLookups[DC].Table.add( - Update.Mod, Update.Data, - reader::ModuleLocalNameLookupTrait(*this, *Update.Mod)); - // NOTE: Can we optimize the case that the data being loaded - // is not related to current module? - DC->setHasExternalVisibleStorage(true); - } - // Load any pending related decls. if (D->isCanonicalDecl()) { if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) { diff --git a/clang/lib/Serialization/ASTReaderInternals.h b/clang/lib/Serialization/ASTReaderInternals.h index 4be2b2323ec401..be0d22d1f4094f 100644 --- a/clang/lib/Serialization/ASTReaderInternals.h +++ b/clang/lib/Serialization/ASTReaderInternals.h @@ -31,7 +31,6 @@ class FileEntry; struct HeaderFileInfo; class HeaderSearch; class ObjCMethodDecl; -class Module; namespace serialization { @@ -39,8 +38,9 @@ class ModuleFile; namespace reader { -class ASTDeclContextNameLookupTraitBase { -protected: +/// Class that performs name lookup into a DeclContext stored +/// in an AST file. +class ASTDeclContextNameLookupTrait { ASTReader &Reader; ModuleFile &F; @@ -80,38 +80,12 @@ class ASTDeclContextNameLookupTraitBase { using offset_type = unsigned; using file_type = ModuleFile *; -protected: - explicit ASTDeclContextNameLookupTraitBase(ASTReader &Reader, ModuleFile &F) - : Reader(Reader), F(F) {} - -public: - static std::pair<unsigned, unsigned> - ReadKeyDataLength(const unsigned char *&d); - - void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, - data_type_builder &Val); - - static void MergeDataInto(const data_type &From, data_type_builder &To) { - To.Data.reserve(To.Data.size() + From.size()); - for (GlobalDeclID ID : From) - To.insert(ID); - } - - file_type ReadFileRef(const unsigned char *&d); - - DeclarationNameKey ReadKeyBase(const unsigned char *&d); -}; - -/// Class that performs name lookup into a DeclContext stored -/// in an AST file. -class ASTDeclContextNameLookupTrait : public ASTDeclContextNameLookupTraitBase { -public: - explicit ASTDeclContextNameLookupTrait(ASTReader &Reader, ModuleFile &F) - : ASTDeclContextNameLookupTraitBase(Reader, F) {} - using external_key_type = DeclarationName; using internal_key_type = DeclarationNameKey; + explicit ASTDeclContextNameLookupTrait(ASTReader &Reader, ModuleFile &F) + : Reader(Reader), F(F) {} + static bool EqualKey(const internal_key_type &a, const internal_key_type &b) { return a == b; } @@ -124,39 +98,25 @@ class ASTDeclContextNameLookupTrait : public ASTDeclContextNameLookupTraitBase { return Name; } + static std::pair<unsigned, unsigned> + ReadKeyDataLength(const unsigned char *&d); + internal_key_type ReadKey(const unsigned char *d, unsigned); void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val); -}; -struct DeclContextLookupTable { - MultiOnDiskHashTable<ASTDeclContextNameLookupTrait> Table; -}; - -class ModuleLocalNameLookupTrait : public ASTDeclContextNameLookupTraitBase { -public: - explicit ModuleLocalNameLookupTrait(ASTReader &Reader, ModuleFile &F) - : ASTDeclContextNameLookupTraitBase(Reader, F) {} - - using external_key_type = std::pair<DeclarationName, const Module *>; - using internal_key_type = std::pair<DeclarationNameKey, unsigned>; - - static bool EqualKey(const internal_key_type &a, const internal_key_type &b) { - return a == b; + static void MergeDataInto(const data_type &From, data_type_builder &To) { + To.Data.reserve(To.Data.size() + From.size()); + for (GlobalDeclID ID : From) + To.insert(ID); } - static hash_value_type ComputeHash(const internal_key_type &Key); - static internal_key_type GetInternalKey(const external_key_type &Key); - - internal_key_type ReadKey(const unsigned char *d, unsigned); - - void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, - data_type_builder &Val); + file_type ReadFileRef(const unsigned char *&d); }; -struct ModuleLocalLookupTable { - MultiOnDiskHashTable<ModuleLocalNameLookupTrait> Table; +struct DeclContextLookupTable { + MultiOnDiskHashTable<ASTDeclContextNameLookupTrait> Table; }; using LazySpecializationInfo = GlobalDeclID; diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 1cc6a9b7950078..0ae2157eed4ecc 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1088,7 +1088,6 @@ void ASTWriter::WriteBlockInfoBlock() { RECORD(DECL_BLOCK); RECORD(DECL_CONTEXT_LEXICAL); RECORD(DECL_CONTEXT_VISIBLE); - RECORD(DECL_CONTEXT_MODULE_LOCAL_VISIBLE); RECORD(DECL_NAMESPACE); RECORD(DECL_NAMESPACE_ALIAS); RECORD(DECL_USING); @@ -4027,13 +4026,15 @@ void ASTWriter::handleVTable(CXXRecordDecl *RD) { namespace { -class ASTDeclContextNameLookupTraitBase { -protected: +// Trait used for the on-disk hash table used in the method pool. +class ASTDeclContextNameLookupTrait { ASTWriter &Writer; - using DeclIDsTy = llvm::SmallVector<LocalDeclID, 64>; - DeclIDsTy DeclIDs; + llvm::SmallVector<LocalDeclID, 64> DeclIDs; public: + using key_type = DeclarationNameKey; + using key_type_ref = key_type; + /// A start and end index into DeclIDs, representing a sequence of decls. using data_type = std::pair<unsigned, unsigned>; using data_type_ref = const data_type &; @@ -4041,11 +4042,31 @@ class ASTDeclContextNameLookupTraitBase { using hash_value_type = unsigned; using offset_type = unsigned; -protected: - explicit ASTDeclContextNameLookupTraitBase(ASTWriter &Writer) - : Writer(Writer) {} + explicit ASTDeclContextNameLookupTrait(ASTWriter &Writer) : Writer(Writer) {} + + template<typename Coll> + data_type getData(const Coll &Decls) { + unsigned Start = DeclIDs.size(); + for (NamedDecl *D : Decls) { + NamedDecl *DeclForLocalLookup = + getDeclForLocalLookup(Writer.getLangOpts(), D); + + if (Writer.getDoneWritingDeclsAndTypes() && + !Writer.wasDeclEmitted(DeclForLocalLookup)) + continue; + + // Try to avoid writing internal decls to reduced BMI. + // See comments in ASTWriter::WriteDeclContextLexicalBlock for details. + if (Writer.isGeneratingReducedBMI() && + !DeclForLocalLookup->isFromExplicitGlobalModule() && + IsInternalDeclFromFileContext(DeclForLocalLookup)) + continue; + + DeclIDs.push_back(Writer.GetDeclRef(DeclForLocalLookup)); + } + return std::make_pair(Start, DeclIDs.size()); + } -public: data_type ImportData(const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) { unsigned Start = DeclIDs.size(); DeclIDs.insert( @@ -4055,6 +4076,14 @@ class ASTDeclContextNameLookupTraitBase { return std::make_pair(Start, DeclIDs.size()); } + static bool EqualKey(key_type_ref a, key_type_ref b) { + return a == b; + } + + hash_value_type ComputeHash(DeclarationNameKey Name) { + return Name.getHash(); + } + void EmitFileRef(raw_ostream &Out, ModuleFile *F) const { assert(Writer.hasChain() && "have reference to loaded module file but no chain?"); @@ -4065,9 +4094,9 @@ class ASTDeclContextNameLookupTraitBase { llvm::endianness::little); } - std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out, - DeclarationNameKey Name, - data_type_ref Lookup) { + std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out, + DeclarationNameKey Name, + data_type_ref Lookup) { unsigned KeyLen = 1; switch (Name.getKind()) { case DeclarationName::Identifier: @@ -4093,10 +4122,10 @@ class ASTDeclContextNameLookupTraitBase { // length of DeclIDs. unsigned DataLen = sizeof(DeclID) * (Lookup.second - Lookup.first); - return {KeyLen, DataLen}; + return emitULEBKeyDataLength(KeyLen, DataLen, Out); } - void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) { + void EmitKey(raw_ostream &Out, DeclarationNameKey Name, unsigned) { using namespace llvm::support; endian::Writer LE(Out, llvm::endianness::little); @@ -4127,7 +4156,8 @@ class ASTDeclContextNameLookupTraitBase { llvm_unreachable("Invalid name kind?"); } - void EmitDataBase(raw_ostream &Out, data_type Lookup, unsigned DataLen) { + void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup, + unsigned DataLen) { using namespace llvm::support; endian::Writer LE(Out, llvm::endianness::little); @@ -4138,129 +4168,6 @@ class ASTDeclContextNameLookupTraitBase { } }; -class ModuleLocalNameLookupTrait : public ASTDeclContextNameLookupTraitBase { -public: - using primary_module_hash_type = unsigned; - - using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>; - using key_type_ref = key_type; - - explicit ModuleLocalNameLookupTrait(ASTWriter &Writer) - : ASTDeclContextNameLookupTraitBase(Writer) {} - - data_type getData(const DeclIDsTy &LocalIDs) { - unsigned Start = DeclIDs.size(); - for (auto ID : LocalIDs) - DeclIDs.push_back(ID); - return std::make_pair(Start, DeclIDs.size()); - } - - static bool EqualKey(key_type_ref a, key_type_ref b) { return a == b; } - - hash_value_type ComputeHash(key_type Key) { - llvm::FoldingSetNodeID ID; - ID.AddInteger(Key.first.getHash()); - ID.AddInteger(Key.second); - return ID.computeStableHash(); - } - - std::pair<unsigned, unsigned> - EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) { - auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup); - KeyLen += sizeof(Key.second); - return emitULEBKeyDataLength(KeyLen, DataLen, Out); - } - - void EmitKey(raw_ostream &Out, key_type Key, unsigned) { - EmitKeyBase(Out, Key.first); - llvm::support::endian::Writer LE(Out, llvm::endianness::little); - LE.write<primary_module_hash_type>(Key.second); - } - - void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup, - unsigned DataLen) { - EmitDataBase(Out, Lookup, DataLen); - } -}; - -// Trait used for the on-disk hash table used in the method pool. -class ASTDeclContextNameLookupTrait : public ASTDeclContextNameLookupTraitBase { -public: - using ModuleLocalDeclsMapTy = - llvm::DenseMap<ModuleLocalNameLookupTrait::key_type, DeclIDsTy>; - -private: - ModuleLocalDeclsMapTy ModuleLocalDeclsMap; - -public: - using key_type = DeclarationNameKey; - using key_type_ref = key_type; - - explicit ASTDeclContextNameLookupTrait(ASTWriter &Writer) - : ASTDeclContextNameLookupTraitBase(Writer) {} - - template <typename Coll> data_type getData(const Coll &Decls) { - unsigned Start = DeclIDs.size(); - for (NamedDecl *D : Decls) { - NamedDecl *DeclForLocalLookup = - getDeclForLocalLookup(Writer.getLangOpts(), D); - - if (Writer.getDoneWritingDeclsAndTypes() && - !Writer.wasDeclEmitted(DeclForLocalLookup)) - continue; - - // Try to avoid writing internal decls to reduced BMI. - // See comments in ASTWriter::WriteDeclContextLexicalBlock for details. - if (Writer.isGeneratingReducedBMI() && - !DeclForLocalLookup->isFromExplicitGlobalModule() && - IsInternalDeclFromFileContext(DeclForLocalLookup)) - continue; - - auto ID = Writer.GetDeclRef(DeclForLocalLookup); - - if (D->getFormalLinkage() == Linkage::Module) { - if (std::optional<unsigned> PrimaryModuleHash = - getPrimaryModuleHash(D->getOwningModule())) { - auto Key = std::make_pair(D->getDeclName(), *PrimaryModuleHash); - auto Iter = ModuleLocalDeclsMap.find(Key); - if (Iter == ModuleLocalDeclsMap.end()) - ModuleLocalDeclsMap.insert({Key, DeclIDsTy{ID}}); - else - Iter->second.push_back(ID); - continue; - } - } - - DeclIDs.push_back(ID); - } - return std::make_pair(Start, DeclIDs.size()); - } - - const ModuleLocalDeclsMapTy &getModuleLocalDecls() { - return ModuleLocalDeclsMap; - } - - static bool EqualKey(key_type_ref a, key_type_ref b) { return a == b; } - - hash_value_type ComputeHash(key_type Name) { return Name.getHash(); } - - std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out, - DeclarationNameKey Name, - data_type_ref Lookup) { - auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup); - return emitULEBKeyDataLength(KeyLen, DataLen, Out); - } - - void EmitKey(raw_ostream &Out, DeclarationNameKey Name, unsigned) { - return EmitKeyBase(Out, Name); - } - - void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup, - unsigned DataLen) { - EmitDataBase(Out, Lookup, DataLen); - } -}; - } // namespace namespace { @@ -4466,8 +4373,7 @@ static bool isLookupResultNotInteresting(ASTWriter &Writer, void ASTWriter::GenerateNameLookupTable( ASTContext &Context, const DeclContext *ConstDC, - llvm::SmallVectorImpl<char> &LookupTable, - llvm::SmallVectorImpl<char> &ModuleLocalLookupTable) { + llvm::SmallVectorImpl<char> &LookupTable) { assert(!ConstDC->hasLazyLocalLexicalLookups() && !ConstDC->hasLazyExternalLexicalLookups() && "must call buildLookups first"); @@ -4649,28 +4555,6 @@ void ASTWriter::GenerateNameLookupTable( // merged table if there is one. auto *Lookups = Chain ? Chain->getLoadedLookupTables(DC) : nullptr; Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table : nullptr); - - const auto &ModuleLocalDecls = Trait.getModuleLocalDecls(); - if (ModuleLocalDecls.empty()) - return; - - MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait, - ModuleLocalNameLookupTrait> - ModuleLocalLookupGenerator; - ModuleLocalNameLookupTrait ModuleLocalTrait(*this); - - for (const auto &ModuleLocalIter : ModuleLocalDecls) { - const auto &Key = ModuleLocalIter.first; - const auto &IDs = ModuleLocalIter.second; - ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs), - ModuleLocalTrait); - } - - auto *ModuleLocalLookups = - Chain ? Chain->getModuleLocalLookupTables(DC) : nullptr; - ModuleLocalLookupGenerator.emit( - ModuleLocalLookupTable, ModuleLocalTrait, - ModuleLocalLookups ? &ModuleLocalLookups->Table : nullptr); } /// Write the block containing all of the declaration IDs @@ -4678,10 +4562,8 @@ void ASTWriter::GenerateNameLookupTable( /// /// \returns the offset of the DECL_CONTEXT_VISIBLE block within the /// bitstream, or 0 if no block was written. -void ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, - DeclContext *DC, - uint64_t &VisibleBlockOffset, - uint64_t &ModuleLocalBlockOffset) { +uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, + DeclContext *DC) { // If we imported a key declaration of this namespace, write the visible // lookup results as an update record for it rather than including them // on this declaration. We will only look at key declarations on reload. @@ -4691,7 +4573,7 @@ void ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, for (auto *Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev; Prev = Prev->getPreviousDecl()) if (!Prev->isFromASTFile()) - return; + return 0; // Note that we need to emit an update record for the primary context. UpdatedDeclContexts.insert(DC->getPrimaryContext()); @@ -4740,53 +4622,41 @@ void ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, } } - return; + return 0; } if (DC->getPrimaryContext() != DC) - return; + return 0; // Skip contexts which don't support name lookup. if (!DC->isLookupContext()) - return; + return 0; // If not in C++, we perform name lookup for the translation unit via the // IdentifierInfo chains, don't bother to build a visible-declarations table. if (DC->isTranslationUnit() && !Context.getLangOpts().CPlusPlus) - return; + return 0; // Serialize the contents of the mapping used for lookup. Note that, // although we have two very diff erent code paths, the serialized // representation is the same for both cases: a declaration name, // followed by a size, followed by references to the visible // declarations that have that name. + uint64_t Offset = Stream.GetCurrentBitNo(); StoredDeclsMap *Map = DC->buildLookup(); if (!Map || Map->empty()) - return; + return 0; - VisibleBlockOffset = Stream.GetCurrentBitNo(); // Create the on-disk hash table in a buffer. SmallString<4096> LookupTable; - SmallString<4096> ModuleLocalLookupTable; - GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable); + GenerateNameLookupTable(Context, DC, LookupTable); // Write the lookup table RecordData::value_type Record[] = {DECL_CONTEXT_VISIBLE}; Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record, LookupTable); ++NumVisibleDeclContexts; - - if (ModuleLocalLookupTable.empty()) - return; - - ModuleLocalBlockOffset = Stream.GetCurrentBitNo(); - assert(ModuleLocalBlockOffset > VisibleBlockOffset); - // Write the lookup table - RecordData::value_type ModuleLocalRecord[] = { - DECL_CONTEXT_MODULE_LOCAL_VISIBLE}; - Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev, - ModuleLocalRecord, ModuleLocalLookupTable); - ++NumModuleLocalDeclContexts; + return Offset; } /// Write an UPDATE_VISIBLE block for the given context. @@ -4803,8 +4673,7 @@ void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context, // Create the on-disk hash table in a buffer. SmallString<4096> LookupTable; - SmallString<4096> ModuleLocalLookupTable; - GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable); + GenerateNameLookupTable(Context, DC, LookupTable); // If we're updating a namespace, select a key declaration as the key for the // update record; those are the only ones that will be checked on reload. @@ -4815,15 +4684,6 @@ void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context, RecordData::value_type Record[] = {UPDATE_VISIBLE, getDeclID(cast<Decl>(DC)).getRawValue()}; Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable); - - if (ModuleLocalLookupTable.empty()) - return; - - // Write the module local lookup table - RecordData::value_type ModuleLocalRecord[] = { - UPDATE_MODULE_LOCAL_VISIBLE, getDeclID(cast<Decl>(DC)).getRawValue()}; - Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord, - ModuleLocalLookupTable); } /// Write an FP_PRAGMA_OPTIONS block for the given FPOptions. @@ -6007,8 +5867,7 @@ ASTFileSignature ASTWriter::WriteASTCore(Sema *SemaPtr, StringRef isysroot, // Some simple statistics RecordData::value_type Record[] = { - NumStatements, NumMacros, NumLexicalDeclContexts, NumVisibleDeclContexts, - NumModuleLocalDeclContexts}; + NumStatements, NumMacros, NumLexicalDeclContexts, NumVisibleDeclContexts}; Stream.EmitRecord(STATISTICS, Record); Stream.ExitBlock(); Stream.FlushToWord(); @@ -6085,9 +5944,7 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { RecordData DelayedNamespaceRecord; for (NamespaceDecl *NS : DelayedNamespace) { uint64_t LexicalOffset = WriteDeclContextLexicalBlock(Context, NS); - uint64_t VisibleOffset = 0; - uint64_t ModuleLocalOffset = 0; - WriteDeclContextVisibleBlock(Context, NS, VisibleOffset, ModuleLocalOffset); + uint64_t VisibleOffset = WriteDeclContextVisibleBlock(Context, NS); // Write the offset relative to current block. if (LexicalOffset) @@ -6096,13 +5953,9 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { if (VisibleOffset) VisibleOffset -= DeclTypesBlockStartOffset; - if (ModuleLocalOffset) - ModuleLocalOffset -= DeclTypesBlockStartOffset; - AddDeclRef(NS, DelayedNamespaceRecord); DelayedNamespaceRecord.push_back(LexicalOffset); DelayedNamespaceRecord.push_back(VisibleOffset); - DelayedNamespaceRecord.push_back(ModuleLocalOffset); } // The process of writing lexical and visible block for delayed namespace @@ -6182,12 +6035,6 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv)); - Abv = std::make_shared<llvm::BitCodeAbbrev>(); - Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_MODULE_LOCAL_VISIBLE)); - Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); - Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); - ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv)); - // And a visible updates block for the translation unit. WriteDeclContextVisibleUpdate(Context, TU); diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 7a494cfe1ac64c..3b357f3c50dadb 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -2068,7 +2068,6 @@ void ASTDeclWriter::VisitDeclContext(DeclContext *DC) { uint64_t LexicalOffset = 0; uint64_t VisibleOffset = 0; - uint64_t ModuleLocalOffset = 0; if (Writer.isGeneratingReducedBMI() && isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->isFromExplicitGlobalModule()) { @@ -2079,13 +2078,12 @@ void ASTDeclWriter::VisitDeclContext(DeclContext *DC) { } else { LexicalOffset = Writer.WriteDeclContextLexicalBlock(Record.getASTContext(), DC); - Writer.WriteDeclContextVisibleBlock(Record.getASTContext(), DC, - VisibleOffset, ModuleLocalOffset); + VisibleOffset = + Writer.WriteDeclContextVisibleBlock(Record.getASTContext(), DC); } Record.AddOffset(LexicalOffset); Record.AddOffset(VisibleOffset); - Record.AddOffset(ModuleLocalOffset); } const Decl *ASTWriter::getFirstLocalDecl(const Decl *D) { @@ -2440,7 +2438,6 @@ void ASTWriter::WriteDeclAbbrevs() { // DC Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ModuleLocalOffset DeclEnumAbbrev = Stream.EmitAbbrev(std::move(Abv)); // Abbreviation for DECL_RECORD @@ -2493,7 +2490,6 @@ void ASTWriter::WriteDeclAbbrevs() { // DC Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ModuleLocalOffset DeclRecordAbbrev = Stream.EmitAbbrev(std::move(Abv)); // Abbreviation for DECL_PARM_VAR @@ -2831,11 +2827,6 @@ void ASTWriter::WriteDeclAbbrevs() { Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); DeclContextVisibleLookupAbbrev = Stream.EmitAbbrev(std::move(Abv)); - Abv = std::make_shared<BitCodeAbbrev>(); - Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_MODULE_LOCAL_VISIBLE)); - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); - DeclModuleLocalVisibleLookupAbbrev = Stream.EmitAbbrev(std::move(Abv)); - Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_SPECIALIZATIONS)); Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); diff --git a/clang/test/CXX/basic/basic.scope/basic.scope.namespace/p2.cpp b/clang/test/CXX/basic/basic.scope/basic.scope.namespace/p2.cpp index 54ec6aa61ec37b..d69db40062dae9 100644 --- a/clang/test/CXX/basic/basic.scope/basic.scope.namespace/p2.cpp +++ b/clang/test/CXX/basic/basic.scope/basic.scope.namespace/p2.cpp @@ -62,8 +62,8 @@ void test_late() { not_exported = 1; #ifndef IMPLEMENTATION - // expected-error@-2 {{use of undeclared identifier 'not_exported'; did you mean 'exported'?}} - // expected-n...@p2.cpp:18 {{'exported' declared here}} + // expected-error@-2 {{declaration of 'not_exported' must be imported from module 'A' before it is required}} + // expected-n...@p2.cpp:19 {{declaration here is not visible}} #endif internal = 1; diff --git a/clang/test/CXX/module/basic/basic.link/p2.cppm b/clang/test/CXX/module/basic/basic.link/p2.cppm index 5a497304201dce..19761fb3359cec 100644 --- a/clang/test/CXX/module/basic/basic.link/p2.cppm +++ b/clang/test/CXX/module/basic/basic.link/p2.cppm @@ -62,11 +62,12 @@ import M; void use_from_module_impl() { external_linkage_fn(); - module_linkage_fn(); // expected-error {{use of undeclared identifier 'module_linkage_fn'}} + module_linkage_fn(); // expected-error {{declaration of 'module_linkage_fn' must be imported}} internal_linkage_fn(); // expected-error {{declaration of 'internal_linkage_fn' must be imported}} (void)external_linkage_class{}; (void)module_linkage_class{}; // expected-error {{undeclared identifier}} expected-error 0+{{}} (void)internal_linkage_class{}; // expected-error {{undeclared identifier}} expected-error 0+{{}} + // expected-n...@m.cppm:9 {{declaration here is not visible}} // expected-n...@m.cppm:10 {{declaration here is not visible}} (void)external_linkage_var; (void)module_linkage_var; // expected-error {{undeclared identifier}} diff --git a/clang/test/CXX/module/module.import/p2.cpp b/clang/test/CXX/module/module.import/p2.cpp index 0ad3bc815beac7..6b8e32f746b628 100644 --- a/clang/test/CXX/module/module.import/p2.cpp +++ b/clang/test/CXX/module/module.import/p2.cpp @@ -23,7 +23,10 @@ export A f(); //--- Use.cpp import M; void test() { - A a; // expected-error {{unknown type name 'A'}} + A a; // expected-error {{definition of 'A' must be imported from module 'M' before it is required}} + // expected-error@-1 {{definition of 'A' must be imported from module 'M' before it is required}} expected-error@-1 {{}} + // expected-n...@impl.cppm:2 {{declaration here is not visible}} + // expected-n...@impl.cppm:2 {{definition here is not reachable}} expected-n...@impl.cppm:2 {{}} } //--- UseInPartA.cppm @@ -37,7 +40,10 @@ void test() { export module B; import M; void test() { - A a; // expected-error {{unknown type name 'A'}} + A a; // expected-error {{declaration of 'A' must be imported from module 'M'}} + // expected-error@-1 {{definition of 'A' must be imported from module 'M'}} expected-error@-1 {{}} + // expected-n...@impl.cppm:2 {{declaration here is not visible}} + // expected-n...@impl.cppm:2 {{definition here is not reachable}} expected-n...@impl.cppm:2 {{}} } //--- Private.cppm diff --git a/clang/test/CXX/module/module.interface/p7.cpp b/clang/test/CXX/module/module.interface/p7.cpp index cff5df91e43d4d..1572390f0d2899 100644 --- a/clang/test/CXX/module/module.interface/p7.cpp +++ b/clang/test/CXX/module/module.interface/p7.cpp @@ -57,10 +57,12 @@ void test() { void test2() { auto a = E1::e1; // OK, namespace-scope name E1 is visible and e1 is reachable auto b = e1; // OK, namespace-scope name e1 is visible - auto c = E2::e2; // expected-error {{use of undeclared identifier 'E2'}} - auto d = e2; // expected-error {{use of undeclared identifier 'e2'}} + auto c = E2::e2; // expected-error {{declaration of 'E2' must be imported from module}} + // expected-note@* {{declaration here is not visible}} + auto d = e2; // should be error, namespace-scope name e2 is not visible auto e = E2U::e2; // OK, namespace-scope name E2U is visible and E2::e2 is reachable - auto f = E3::e3; // expected-error {{use of undeclared identifier 'E3'}} - auto g = e3; // expected-error {{use of undeclared identifier 'e3'}} + auto f = E3::e3; // expected-error {{declaration of 'E3' must be imported from module 'p7' before it is required}} + // expected-note@* {{declaration here is not visible}} + auto g = e3; // should be error, namespace-scope name e3 is not visible auto h = decltype(func())::e3; // OK, namespace-scope name f is visible and E3::e3 is reachable } diff --git a/clang/test/CXX/module/module.reach/p5.cpp b/clang/test/CXX/module/module.reach/p5.cpp index 947fd082553ec6..9c498a260530f8 100644 --- a/clang/test/CXX/module/module.reach/p5.cpp +++ b/clang/test/CXX/module/module.reach/p5.cpp @@ -14,4 +14,5 @@ export using Y = X; export module B; import A; Y y; // OK, definition of X is reachable -X x; // expected-error {{unknown type name 'X'}} +X x; // expected-error {{declaration of 'X' must be imported from module 'A' before it is required}} + // expected-note@* {{declaration here is not visible}} diff --git a/clang/test/Modules/Reachability-template-default-arg.cpp b/clang/test/Modules/Reachability-template-default-arg.cpp index a7da86b8cc2d51..35c647d0d344ba 100644 --- a/clang/test/Modules/Reachability-template-default-arg.cpp +++ b/clang/test/Modules/Reachability-template-default-arg.cpp @@ -21,5 +21,6 @@ struct A { import template_default_arg; void bar() { A<> a0; - A<t> a1; // expected-error {{use of undeclared identifier 't'}} + A<t> a1; // expected-error {{declaration of 't' must be imported from module 'template_default_arg' before it is required}} + // expected-note@* {{declaration here is not visible}} } diff --git a/clang/test/Modules/cxx20-10-1-ex2.cpp b/clang/test/Modules/cxx20-10-1-ex2.cpp index 8611d6d64c851f..fc61d89926d448 100644 --- a/clang/test/Modules/cxx20-10-1-ex2.cpp +++ b/clang/test/Modules/cxx20-10-1-ex2.cpp @@ -78,7 +78,8 @@ int &c = n; // OK //--- std10-1-ex2-tu6.cpp import B; // error, n is module-local and this is not a module. -int &c = n; // expected-error {{use of undeclared identifier 'n'}} +int &c = n; // expected-error {{declaration of 'n' must be imported}} + // expected-note@* {{declaration here is not visible}} //--- std10-1-ex2-tu7.cpp // expected-no-diagnostics diff --git a/clang/test/Modules/deduction-guide3.cppm b/clang/test/Modules/deduction-guide3.cppm index f7990004cec7c2..1165dd40bcfb8c 100644 --- a/clang/test/Modules/deduction-guide3.cppm +++ b/clang/test/Modules/deduction-guide3.cppm @@ -22,6 +22,8 @@ Templ(T t) -> Templ<T>; //--- Use.cpp import Templ; void func() { - Templ t(5); // expected-error {{unknown type name 'Templ'}} + Templ t(5); // expected-error {{declaration of 'Templ' must be imported from module 'Templ' before it is required}} + // expected-error@-1 {{unknown type name 'Templ'}} + // expected-n...@templ.cppm:3 {{declaration here is not visible}} } diff --git a/clang/test/Modules/module-local-with-templates.cppm b/clang/test/Modules/module-local-with-templates.cppm deleted file mode 100644 index 87955bdd3f99ee..00000000000000 --- a/clang/test/Modules/module-local-with-templates.cppm +++ /dev/null @@ -1,79 +0,0 @@ -// RUN: rm -rf %t -// RUN: mkdir -p %t -// RUN: split-file %s %t -// -// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm -// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify -// RUN: %clang_cc1 -std=c++20 %t/a-part.cppm -fmodule-file=a=%t/a.pcm -fsyntax-only -verify -// -// Test again with reduced BMI -// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm -// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify -// RUN: %clang_cc1 -std=c++20 %t/a-part.cppm -fmodule-file=a=%t/a.pcm -fsyntax-only -verify -// RUN: %clang_cc1 -std=c++20 %t/a.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify - - -//--- a.cppm -export module a; - -constexpr int x = 43; - -export constexpr int f() { return x; } - -export template <typename T> -constexpr T g() { - return x; -} - -namespace nn { - -constexpr int x = 88; - -export constexpr int f() { return x; } - -export template <typename T> -constexpr T g() { - return x; -} -} - -//--- use.cc -// expected-no-diagnostics -import a; - -static_assert(f() == 43, ""); - -constexpr int x = 99; - -static_assert(g<int>() == 43, ""); - -static_assert(x == 99, ""); - -namespace nn { -static_assert(f() == 88, ""); - -constexpr int x = 1000; - -static_assert(g<int>() == 88, ""); - -static_assert(x == 1000, ""); - -} - -//--- a-part.cppm -module a:impl; -import a; - -static_assert(x == 43, ""); - -constexpr int x = 1000; // expected-error {{redefinition of 'x'}} - // expected-note@* {{previous definition is here}} - -//--- a.cc -module a; - -static_assert(x == 43, ""); - -constexpr int x = 1000; // expected-error {{redefinition of 'x'}} - // expected-note@* {{previous definition is here}} - diff --git a/clang/test/Modules/pr90154.cppm b/clang/test/Modules/pr90154.cppm deleted file mode 100644 index d626646fbc4885..00000000000000 --- a/clang/test/Modules/pr90154.cppm +++ /dev/null @@ -1,25 +0,0 @@ -// RUN: rm -rf %t -// RUN: mkdir -p %t -// RUN: split-file %s %t -// -// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm -// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify -// -// Test again with reduced BMI -// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm -// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify - -//--- a.cppm -export module a; -int b = 99; -namespace a { int a = 43; } - -//--- use.cc -// expected-no-diagnostics -import a; - -namespace a { - double a = 43.0; -} - -int b = 883; diff --git a/clang/unittests/AST/ExternalASTSourceTest.cpp b/clang/unittests/AST/ExternalASTSourceTest.cpp index b42a3be05e9bb1..8e1bde1247f660 100644 --- a/clang/unittests/AST/ExternalASTSourceTest.cpp +++ b/clang/unittests/AST/ExternalASTSourceTest.cpp @@ -68,8 +68,7 @@ TEST(ExternalASTSourceTest, FailedLookupOccursOnce) { TestSource(unsigned &Calls) : Calls(Calls) {} bool FindExternalVisibleDeclsByName(const DeclContext *, - DeclarationName Name, - clang::Module *NamedModule) override { + DeclarationName Name) override { if (Name.getAsString() == "j") ++Calls; return false; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ASTUtils.h b/lldb/source/Plugins/ExpressionParser/Clang/ASTUtils.h index 7403b79be6cc0f..d5c68a436e0903 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ASTUtils.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ASTUtils.h @@ -71,9 +71,8 @@ class ExternalASTSourceWrapper : public clang::ExternalSemaSource { } bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, - clang::DeclarationName Name, - clang::Module *NamedModule) override { - return m_Source->FindExternalVisibleDeclsByName(DC, Name, NamedModule); + clang::DeclarationName Name) override { + return m_Source->FindExternalVisibleDeclsByName(DC, Name); } bool LoadExternalSpecializations(const clang::Decl *D, @@ -389,10 +388,9 @@ class SemaSourceWithPriorities : public clang::ExternalSemaSource { } bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, - clang::DeclarationName Name, - clang::Module *NamedModule) override { + clang::DeclarationName Name) override { for (size_t i = 0; i < Sources.size(); ++i) - if (Sources[i]->FindExternalVisibleDeclsByName(DC, Name, NamedModule)) + if (Sources[i]->FindExternalVisibleDeclsByName(DC, Name)) return true; return false; } diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp index 94ce867ef4a0f9..e41efdd3f61c75 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp @@ -99,8 +99,7 @@ void ClangASTSource::StartTranslationUnit(ASTConsumer *Consumer) { // The core lookup interface. bool ClangASTSource::FindExternalVisibleDeclsByName( - const DeclContext *decl_ctx, DeclarationName clang_decl_name, - clang::Module *NamedModule) { + const DeclContext *decl_ctx, DeclarationName clang_decl_name) { if (!m_ast_context) { SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name); return false; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h index 6dc4ecc94e0edc..83c910477acc8d 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h @@ -84,8 +84,7 @@ class ClangASTSource : public clang::ExternalASTSource, /// \return /// Whatever SetExternalVisibleDeclsForName returns. bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, - clang::DeclarationName Name, - clang::Module *NamedModule) override; + clang::DeclarationName Name) override; /// Enumerate all Decls in a given lexical context. /// @@ -213,9 +212,8 @@ class ClangASTSource : public clang::ExternalASTSource, ClangASTSourceProxy(ClangASTSource &original) : m_original(original) {} bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, - clang::DeclarationName Name, - clang::Module *NamedModule) override { - return m_original.FindExternalVisibleDeclsByName(DC, Name, NamedModule); + clang::DeclarationName Name) override { + return m_original.FindExternalVisibleDeclsByName(DC, Name); } void FindExternalLexicalDecls( diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp index bf4537e69eb636..e746e6afe39bea 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp @@ -50,8 +50,7 @@ void ClangExternalASTSourceCallbacks::FindExternalLexicalDecls( } bool ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName( - const clang::DeclContext *DC, clang::DeclarationName Name, - clang::Module *NamedModule) { + const clang::DeclContext *DC, clang::DeclarationName Name) { llvm::SmallVector<clang::NamedDecl *, 4> decls; // Objective-C methods are not added into the LookupPtr when they originate // from an external source. SetExternalVisibleDeclsForName() adds them. diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h index d2e9c1552fd38c..6bd18186a567d9 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h @@ -38,8 +38,7 @@ class ClangExternalASTSourceCallbacks : public clang::ExternalASTSource { llvm::SmallVectorImpl<clang::Decl *> &Result) override; bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, - clang::DeclarationName Name, - clang::Module *NamedModule) override; + clang::DeclarationName Name) override; void CompleteType(clang::TagDecl *tag_decl) override; diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp index 24fc5bb2c047fe..96a259b811b5e7 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp @@ -30,8 +30,7 @@ class lldb_private::AppleObjCExternalASTSource : m_decl_vendor(decl_vendor) {} bool FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx, - clang::DeclarationName name, - clang::Module *NamedModule) override { + clang::DeclarationName name) override { Log *log(GetLog( LLDBLog::Expressions)); // FIXME - a more appropriate log channel? _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits