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 <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
This commit is contained in:
Nathaniel Shead 2025-09-26 22:03:24 +10:00
parent 6fdee070ff
commit 000cde096d
5 changed files with 6 additions and 56 deletions

View File

@ -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)))

View File

@ -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;
static int impl; // IF but no diagnostic required: impl@Frob not reachable from here
import Frink;
static int ompl;
void corge (int x)
{
impl = x;
ompl = frab (x);
}
static int ompl; // { dg-error "different kind" }

View File

@ -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;
}

View File

@ -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 ();
}

View File

@ -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);
}