diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -1687,8 +1687,8 @@ Module *DeclModule = SemaRef.getOwningModule(D); assert(DeclModule && "hidden decl has no owning module"); - // If the owning module is visible, the decl is visible. if (SemaRef.isModuleVisible(DeclModule, D->isModulePrivate())) + // If the owning module is visible, the decl is visible. return true; // Determine whether a decl context is a file context for the purpose of @@ -1762,6 +1762,22 @@ if (ModulePrivate) { if (isInCurrentModule(M, getLangOpts())) return true; + else if (M->Kind == Module::ModuleKind::ModulePartitionImplementation && + isModuleDirectlyImported(M)) + // Unless a partition implementation is directly imported it is not + // counted as visible for lookup, although the contained decls might + // still be reachable. It's a partition, so it must be part of the + // current module to be a valid import. + return true; + else if (getLangOpts().CPlusPlusModules && !ModuleScopes.empty() && + ModuleScopes[0].Module->Kind == + Module::ModuleKind::ModulePartitionImplementation && + ModuleScopes[0].Module->getPrimaryModuleInterfaceName() == + M->Name && + isModuleDirectlyImported(M)) + // We are building a module implementation partition and the TU imports + // the primary module interface unit. + return true; } else { if (VisibleModules.isVisible(M)) return true; diff --git a/clang/test/Modules/cxx20-10-1-ex2.cpp b/clang/test/Modules/cxx20-10-1-ex2.cpp --- a/clang/test/Modules/cxx20-10-1-ex2.cpp +++ b/clang/test/Modules/cxx20-10-1-ex2.cpp @@ -12,9 +12,8 @@ // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/std10-1-ex2-tu3.cpp \ // RUN: -o %t/B_X1.pcm -verify -// Not expected to work yet. -// %clang_cc1 -std=c++20 -emit-module-interface %t/std10-1-ex2-tu4.cpp \ -// -fmodule-file=%t/B.pcm -o %t/B_X2.pcm +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/std10-1-ex2-tu4.cpp \ +// RUN:-fmodule-file=%t/B.pcm -o %t/B_X2.pcm // RUN: %clang_cc1 -std=c++20 -emit-obj %t/std10-1-ex2-tu5.cpp \ // RUN: -fmodule-file=%t/B.pcm -o %t/b_tu5.o @@ -22,9 +21,8 @@ // RUN: %clang_cc1 -std=c++20 -S %t/std10-1-ex2-tu6.cpp \ // RUN: -fmodule-file=%t/B.pcm -o %t/b_tu6.s -verify -// Not expected to work yet. -// %clang_cc1 -std=c++20 -emit-module-interface %t/std10-1-ex2-tu7.cpp \ -// -fmodule-file=%t/B_X2.pcm -o %t/B_X3.pcm -verify +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/std10-1-ex2-tu7.cpp \ +// RUN: -fmodule-file=%t/B_X2.pcm -o %t/B_X3.pcm -verify //--- std10-1-ex2-tu1.cpp module B:Y;