Bigcheese created this revision. Bigcheese added reviewers: jansvoboda11, dblaikie, iains, ChuanqiXu. Bigcheese added projects: clang-modules, clang. Herald added a subscriber: ributzka. Herald added a project: All. Bigcheese requested review of this revision.
Currently there is no way to have Objective-C++20 without LSV. This is a problem because some existing ObjectiveC code is not compatible with LSV. This patch provides a way to disable LSV even in C++20 mode. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D141450 Files: clang/include/clang/Driver/Options.td clang/test/Modules/fno-modules-local-submodule-visibility.mm Index: clang/test/Modules/fno-modules-local-submodule-visibility.mm =================================================================== --- /dev/null +++ clang/test/Modules/fno-modules-local-submodule-visibility.mm @@ -0,0 +1,35 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: %clang_cc1 -std=c++20 -fmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t -fsyntax-only -I %t/include -x objective-c++ \ +// RUN: %t/tu.m -verify -fno-modules-local-submodule-visibility +// RUN: %clang_cc1 -std=c++20 -fmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t -fsyntax-only -I %t/include -x objective-c++ \ +// RUN: %t/tu2.m -verify + +//--- include/module.modulemap + +module M { + module A { + header "A.h" + export * + } + module B { + header "B.h" + export * + } +} + +//--- include/A.h +#define A 1 + +//--- include/B.h +inline int B = A; + +//--- tu.m +@import M; +int i = B; +// expected-no-diagnostics + +//--- tu2.m +@import M; // expected-error {{could not build module 'M'}} Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5918,12 +5918,13 @@ "duplicating work in competing clang invocations.">>; // FIXME: We only need this in C++ modules / Modules TS if we might textually // enter a different module (eg, when building a header unit). -def fmodules_local_submodule_visibility : - Flag<["-"], "fmodules-local-submodule-visibility">, - HelpText<"Enforce name visibility rules across submodules of the same " - "top-level module.">, - MarshallingInfoFlag<LangOpts<"ModulesLocalVisibility">>, - ImpliedByAnyOf<[fmodules_ts.KeyPath, fcxx_modules.KeyPath]>; +defm modules_local_submodule_visibility : + BoolFOption<"modules-local-submodule-visibility", + LangOpts<"ModulesLocalVisibility">, + Default<!strconcat(fmodules_ts.KeyPath, "||", fcxx_modules.KeyPath)>, + PosFlag<SetTrue, [], "name visibility rules across submodules of the same " + "top-level module">, + NegFlag<SetFalse>>; def fmodules_codegen : Flag<["-"], "fmodules-codegen">, HelpText<"Generate code for uses of this module that assumes an explicit "
Index: clang/test/Modules/fno-modules-local-submodule-visibility.mm =================================================================== --- /dev/null +++ clang/test/Modules/fno-modules-local-submodule-visibility.mm @@ -0,0 +1,35 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: %clang_cc1 -std=c++20 -fmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t -fsyntax-only -I %t/include -x objective-c++ \ +// RUN: %t/tu.m -verify -fno-modules-local-submodule-visibility +// RUN: %clang_cc1 -std=c++20 -fmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t -fsyntax-only -I %t/include -x objective-c++ \ +// RUN: %t/tu2.m -verify + +//--- include/module.modulemap + +module M { + module A { + header "A.h" + export * + } + module B { + header "B.h" + export * + } +} + +//--- include/A.h +#define A 1 + +//--- include/B.h +inline int B = A; + +//--- tu.m +@import M; +int i = B; +// expected-no-diagnostics + +//--- tu2.m +@import M; // expected-error {{could not build module 'M'}} Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5918,12 +5918,13 @@ "duplicating work in competing clang invocations.">>; // FIXME: We only need this in C++ modules / Modules TS if we might textually // enter a different module (eg, when building a header unit). -def fmodules_local_submodule_visibility : - Flag<["-"], "fmodules-local-submodule-visibility">, - HelpText<"Enforce name visibility rules across submodules of the same " - "top-level module.">, - MarshallingInfoFlag<LangOpts<"ModulesLocalVisibility">>, - ImpliedByAnyOf<[fmodules_ts.KeyPath, fcxx_modules.KeyPath]>; +defm modules_local_submodule_visibility : + BoolFOption<"modules-local-submodule-visibility", + LangOpts<"ModulesLocalVisibility">, + Default<!strconcat(fmodules_ts.KeyPath, "||", fcxx_modules.KeyPath)>, + PosFlag<SetTrue, [], "name visibility rules across submodules of the same " + "top-level module">, + NegFlag<SetFalse>>; def fmodules_codegen : Flag<["-"], "fmodules-codegen">, HelpText<"Generate code for uses of this module that assumes an explicit "
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits