From fa6544ef5f50a824cabeda4906453d4545fbf66f Mon Sep 17 00:00:00 2001 From: Nathaniel Shead Date: Fri, 26 Sep 2025 22:10:15 +1000 Subject: [PATCH] c++/modules: Avoid ICE when redefining a type reachable via import [PR122053] 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 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 Reviewed-by: Jason Merrill --- 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 85c7fcc7a6e..09d16db2ead 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -8597,6 +8597,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 *-*-* } } -- 2.47.3