Author: Iain Sandoe Date: 2022-03-01T08:29:05Z New Revision: a29f8dbb7f3e816344a7be75996eea3ab5a0b5a3
URL: https://github.com/llvm/llvm-project/commit/a29f8dbb7f3e816344a7be75996eea3ab5a0b5a3 DIFF: https://github.com/llvm/llvm-project/commit/a29f8dbb7f3e816344a7be75996eea3ab5a0b5a3.diff LOG: [C++20][Modules][8/8] Amend module visibility rules for partitions. Implementation partitions bring two extra cases where we have visibility of module-private data. 1) When we import a module implementation partition. 2) When a partition implementation imports the primary module intertace. We maintain a record of direct imports into the current module since partition decls from direct imports (but not trasitive ones) are visible. The rules on decl-reachability are much more relaxed (with the standard giving permission for an implementation to load dependent modules and for the decls there to be reachable, but not visible). Differential Revision: https://reviews.llvm.org/D118599 Added: Modified: clang/lib/Sema/SemaLookup.cpp clang/test/Modules/cxx20-10-1-ex2.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 13320497c4b4b..65f5112afee3e 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -1687,8 +1687,8 @@ bool LookupResult::isVisibleSlow(Sema &SemaRef, NamedDecl *D) { 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 @@ bool Sema::isModuleVisible(const Module *M, bool ModulePrivate) { 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 index 66323fc9d6460..6b47fb0f41eec 100644 --- 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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits