On 9/26/25 1:16 PM, Nathaniel Shead wrote:
Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
OK.
-- >8 --
This shouldn't be an error (see PR c++/99000), but we can at least avoid
the ICE by ensuring that we load any pending type definition before
calling pushdecl, so that we error before committing to filling in the
class definition.
Something like this will probably still be helpful even for implementing
textual deduplication as we now at least ensure check_module_override
(and hence duplicate_decls) is called for this case.
PR c++/122053
gcc/cp/ChangeLog:
* name-lookup.cc (pushtag): Load any imported definition of type
before calling pushdecl.
gcc/testsuite/ChangeLog:
* g++.dg/modules/pr122053_a.C: New test.
* g++.dg/modules/pr122053_b.C: New test.
Signed-off-by: Nathaniel Shead <[email protected]>
---
gcc/cp/name-lookup.cc | 6 ++++++
gcc/testsuite/g++.dg/modules/pr122053_a.C | 10 ++++++++++
gcc/testsuite/g++.dg/modules/pr122053_b.C | 9 +++++++++
3 files changed, 25 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/modules/pr122053_a.C
create mode 100644 gcc/testsuite/g++.dg/modules/pr122053_b.C
diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index 86482bc110e..36a61e394fc 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -8557,6 +8557,12 @@ pushtag (tree name, tree type, TAG_how how)
}
else
{
+ /* If an import is going to provide a definition for this tag,
+ load it now so that we don't get confused later when processing
+ this tag's definition. */
+ if (modules_p ())
+ lazy_load_pendings (decl);
+
decl = do_pushdecl_with_scope
(decl, b, /*hiding=*/(how == TAG_how::HIDDEN_FRIEND));
if (decl == error_mark_node)
diff --git a/gcc/testsuite/g++.dg/modules/pr122053_a.C
b/gcc/testsuite/g++.dg/modules/pr122053_a.C
new file mode 100644
index 00000000000..2a8748c6be0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr122053_a.C
@@ -0,0 +1,10 @@
+// PR c++/122053
+// { dg-additional-options "-fmodules -Wno-global-module" }
+// { dg-module-cmi M }
+
+module;
+struct mytime {
+ long a, b;
+};
+export module M;
+export mytime foo();
diff --git a/gcc/testsuite/g++.dg/modules/pr122053_b.C
b/gcc/testsuite/g++.dg/modules/pr122053_b.C
new file mode 100644
index 00000000000..a7084b74040
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr122053_b.C
@@ -0,0 +1,9 @@
+// PR c++/122053
+// { dg-additional-options "-fmodules" }
+// Test we don't ICE when redefining a type coming from an import.
+
+import M;
+struct mytime { // { dg-bogus "conflicting" "PR99000" { xfail *-*-* } }
+ long a, b;
+};
+mytime m = foo(); // { dg-bogus "" "PR99000" { xfail *-*-* } }