https://gcc.gnu.org/g:000cde096d2f60b968890f3075e839bf19c7f4a2

commit r16-4227-g000cde096d2f60b968890f3075e839bf19c7f4a2
Author: Nathaniel Shead <[email protected]>
Date:   Fri Sep 26 22:03:24 2025 +1000

    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 <[email protected]>
    Reviewed-by: Jason Merrill <[email protected]>

Diff:
---
 gcc/cp/name-lookup.cc                        |  2 +-
 gcc/testsuite/g++.dg/modules/namespace-1_c.C | 14 ++++----------
 gcc/testsuite/g++.dg/modules/namespace-2_b.C | 13 +------------
 gcc/testsuite/g++.dg/modules/namespace-3_a.C | 21 ---------------------
 gcc/testsuite/g++.dg/modules/namespace-3_b.C | 12 ------------
 5 files changed, 6 insertions(+), 56 deletions(-)

diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index 8d7fc06f6988..85c7fcc7a6e8 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 748ef5d79a4b..e4f81b6bea66 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 6ab5113c23ab..d71c630c75e6 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 8e9508d7ff8c..000000000000
--- 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 f779ffe8c8f8..000000000000
--- 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);
-}

Reply via email to