]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: import confict with builtin
authorJason Merrill <jason@redhat.com>
Sun, 2 Nov 2025 06:44:10 +0000 (09:44 +0300)
committerJason Merrill <jason@redhat.com>
Mon, 3 Nov 2025 18:32:26 +0000 (21:32 +0300)
27_io/headers/iostream/synopsis.cc was failing with modules because pushdecl
called update_binding for a redeclared import while passing the built-in
clog as "old".  This could also be fixed by discarding the builtin in
e.g. import_module_binding, but this seems straightforward.

gcc/cp/ChangeLog:

* name-lookup.cc (pushdecl): Discard built-in sooner.

gcc/testsuite/ChangeLog:

* g++.dg/modules/builtin-9_a.C: New test.
* g++.dg/modules/builtin-9_b.C: New test.

gcc/cp/name-lookup.cc
gcc/testsuite/g++.dg/modules/builtin-9_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/builtin-9_b.C [new file with mode: 0644]

index b7530616ef06ab43c059b9e5164aacf26912ccd0..2b34102c730b81c4ef3d0b297baed92579da9ee6 100644 (file)
@@ -4063,6 +4063,11 @@ pushdecl (tree decl, bool hiding)
              }
        }
 
+      /* Skip a hidden builtin we failed to match already.  There can
+        only be one.  */
+      if (old && anticipated_builtin_p (old))
+       old = OVL_CHAIN (old);
+
       /* Check for redeclaring an import.  */
       if (slot && *slot && TREE_CODE (*slot) == BINDING_VECTOR)
        if (tree match
@@ -4081,11 +4086,6 @@ pushdecl (tree decl, bool hiding)
 
       /* We are pushing a new decl.  */
 
-      /* Skip a hidden builtin we failed to match already.  There can
-        only be one.  */
-      if (old && anticipated_builtin_p (old))
-       old = OVL_CHAIN (old);
-
       if (hiding)
        ; /* Hidden bindings don't shadow anything.  */
       else
diff --git a/gcc/testsuite/g++.dg/modules/builtin-9_a.C b/gcc/testsuite/g++.dg/modules/builtin-9_a.C
new file mode 100644 (file)
index 0000000..69b0e37
--- /dev/null
@@ -0,0 +1,16 @@
+// Test that the built-in clog doesn't interfere with redeclaring the import.
+
+// { dg-additional-options "-fmodules -Wno-global-module" }
+
+module;
+
+namespace std {
+  class ostream;
+  extern ostream clog;
+}
+
+export module M;
+
+namespace std {
+  export using std::clog;
+}
diff --git a/gcc/testsuite/g++.dg/modules/builtin-9_b.C b/gcc/testsuite/g++.dg/modules/builtin-9_b.C
new file mode 100644 (file)
index 0000000..30ea013
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-additional-options -fmodules }
+
+import M;
+
+namespace std {
+  class ostream;
+  extern ostream clog;
+}