From: Nathaniel Shead Date: Fri, 26 Sep 2025 12:03:24 +0000 (+1000) Subject: c++/modules: Also check conflicting internal-linkage entities X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=000cde096d2f60b968890f3075e839bf19c7f4a2;p=thirdparty%2Fgcc.git c++/modules: Also check conflicting internal-linkage entities While investigating another issue I noticed that the condition in check_module_override seems incorrect: the wording in [basic.link] p11 has no exceptions for internal-linkage entities. gcc/cp/ChangeLog: * name-lookup.cc (check_module_override): Remove check for TREE_PUBLIC when checking mergeable entities. gcc/testsuite/ChangeLog: * g++.dg/modules/namespace-1_c.C: Adjust to expect errors. * g++.dg/modules/namespace-2_b.C: Likewise. * g++.dg/modules/namespace-3_a.C: Removed. * g++.dg/modules/namespace-3_b.C: Removed. Signed-off-by: Nathaniel Shead Reviewed-by: Jason Merrill --- diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index 8d7fc06f698..85c7fcc7a6e 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -3882,7 +3882,7 @@ check_module_override (tree decl, tree mvec, bool hiding, } } - if (TREE_PUBLIC (scope) && TREE_PUBLIC (STRIP_TEMPLATE (decl)) + if (TREE_PUBLIC (scope) /* Namespaces are dealt with specially in make_namespace_finish. */ && !(TREE_CODE (decl) == NAMESPACE_DECL && !DECL_NAMESPACE_ALIAS (decl))) diff --git a/gcc/testsuite/g++.dg/modules/namespace-1_c.C b/gcc/testsuite/g++.dg/modules/namespace-1_c.C index 748ef5d79a4..e4f81b6bea6 100644 --- a/gcc/testsuite/g++.dg/modules/namespace-1_c.C +++ b/gcc/testsuite/g++.dg/modules/namespace-1_c.C @@ -1,13 +1,7 @@ // { dg-additional-options "-fmodules-ts" } -// The indirect import of frob, with namespaces impl and ompl doesn't -// affect us. -static int impl; -import Frink; -static int ompl; +static int impl; // IF but no diagnostic required: impl@Frob not reachable from here + +import Frink; -void corge (int x) -{ - impl = x; - ompl = frab (x); -} +static int ompl; // { dg-error "different kind" } diff --git a/gcc/testsuite/g++.dg/modules/namespace-2_b.C b/gcc/testsuite/g++.dg/modules/namespace-2_b.C index 6ab5113c23a..d71c630c75e 100644 --- a/gcc/testsuite/g++.dg/modules/namespace-2_b.C +++ b/gcc/testsuite/g++.dg/modules/namespace-2_b.C @@ -2,16 +2,5 @@ import foo; -static int also_not_exported; // ok - -void X () -{ - implicit_export::bob (); -} - +static int also_not_exported; // { dg-error "different kind" } static int implicit_export; // { dg-error "different kind" } - -void Y () -{ - also_not_exported = 1; -} diff --git a/gcc/testsuite/g++.dg/modules/namespace-3_a.C b/gcc/testsuite/g++.dg/modules/namespace-3_a.C deleted file mode 100644 index 8e9508d7ff8..00000000000 --- a/gcc/testsuite/g++.dg/modules/namespace-3_a.C +++ /dev/null @@ -1,21 +0,0 @@ -// Check namespace needed only by internal reference is not made visible -// { dg-additional-options "-fmodules-ts" } - -export module frob; -// { dg-module-cmi frob } - -namespace silent -{ - namespace inner - { - static int X () - { - return 1; - } - } -} - -export int f (int y) -{ - return y + silent::inner::X (); -} diff --git a/gcc/testsuite/g++.dg/modules/namespace-3_b.C b/gcc/testsuite/g++.dg/modules/namespace-3_b.C deleted file mode 100644 index f779ffe8c8f..00000000000 --- a/gcc/testsuite/g++.dg/modules/namespace-3_b.C +++ /dev/null @@ -1,12 +0,0 @@ -// { dg-additional-options "-fmodules-ts" } - -import frob; - -int x = silent; // { dg-error "not declared" } - -static int silent; - -int user () -{ - return f (silent); -}