c++/modules: import confict with builtin

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.
This commit is contained in:
Jason Merrill
2025-11-02 09:44:10 +03:00
parent 5926cc99ae
commit 3ce8734508
3 changed files with 29 additions and 5 deletions

View 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

View File

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

View File

@@ -0,0 +1,8 @@
// { dg-additional-options -fmodules }
import M;
namespace std {
class ostream;
extern ostream clog;
}