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>
}
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)
--- /dev/null
+// 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();
--- /dev/null
+// 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 *-*-* } }