This was simply an overzealous assert. Possibly correct thinking at the time that code was written, but not true now. Of course we can have imported artificial decls.
PR c++/99239 gcc/cp/ * decl.c (duplicate_decls): Remove assert about maybe-imported artificial decls. gcc/testsuite/ * g++.dg/modules/pr99239_a.H: New. * g++.dg/modules/pr99239_b.H: New. -- Nathan Sidwell
diff --git c/gcc/cp/decl.c w/gcc/cp/decl.c index 8e8f37d060e..289db3074be 100644 --- c/gcc/cp/decl.c +++ w/gcc/cp/decl.c @@ -2041,8 +2041,6 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden) { if (DECL_ARTIFICIAL (olddecl)) { - gcc_checking_assert (!(DECL_LANG_SPECIFIC (olddecl) - && DECL_MODULE_IMPORT_P (olddecl))); if (!(global_purview_p () || not_module_p ())) error ("declaration %qD conflicts with builtin", newdecl); else diff --git c/gcc/testsuite/g++.dg/modules/pr99239_a.H w/gcc/testsuite/g++.dg/modules/pr99239_a.H new file mode 100644 index 00000000000..35f006fe9b2 --- /dev/null +++ w/gcc/testsuite/g++.dg/modules/pr99239_a.H @@ -0,0 +1,13 @@ +// PR 99239 ICE on catch clause +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } + +inline void Foo () +{ + try + {} + catch(...) + { + } +} + diff --git c/gcc/testsuite/g++.dg/modules/pr99239_b.H w/gcc/testsuite/g++.dg/modules/pr99239_b.H new file mode 100644 index 00000000000..92638d663c7 --- /dev/null +++ w/gcc/testsuite/g++.dg/modules/pr99239_b.H @@ -0,0 +1,12 @@ +// { dg-additional-options {-fmodule-header -fno-module-lazy} } +// { dg-module-cmi {} } +import "pr99239_a.H"; + +inline void + _M_remove_reference() throw() +{ + try + { } + catch(...) + { } +}