]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: Avoid ICE when redefining a type reachable via import [PR122053]
authorNathaniel Shead <nathanieloshead@gmail.com>
Fri, 26 Sep 2025 12:10:15 +0000 (22:10 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Sun, 5 Oct 2025 10:37:33 +0000 (21:37 +1100)
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 <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/name-lookup.cc
gcc/testsuite/g++.dg/modules/pr122053_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr122053_b.C [new file with mode: 0644]

index 85c7fcc7a6e8095510ae80e8a27024ec702731e0..09d16db2ead881d9e975c7b5ea6bef19769f96eb 100644 (file)
@@ -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 (file)
index 0000000..2a8748c
--- /dev/null
@@ -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 (file)
index 0000000..a7084b7
--- /dev/null
@@ -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 *-*-* } }