https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91222
--- Comment #2 from Jan Hubicka <hubicka at gcc dot gnu.org> --- This patch fixes the ICE Index: ipa-devirt.c =================================================================== --- ipa-devirt.c (revision 273865) +++ ipa-devirt.c (working copy) @@ -1003,7 +1003,7 @@ warn_types_mismatch (tree t1, tree t2, l n2 = DECL_NAME (n2); /* Most of the time, the type names will match, do not be unnecesarily verbose. */ - if (IDENTIFIER_POINTER (n1) != IDENTIFIER_POINTER (n2)) + if (n1 != n2) inform (loc_t1, "type %qT defined in anonymous namespace cannot match " "type %qT across the translation unit boundary", however the warnings output are: 2.ii:62:3: warning: ‘ml_bssnrest_’ violates the C++ One Definition Rule [-Wodr] 62 | } ml_bssnrest_; | ^ 1.ii:2:8: note: type ‘struct <anon>’ defined in anonymous namespace cannot match across the translation unit boundary 2 | struct { | ^ 2.ii:2:15: note: the incompatible type defined in another translation unit 2 | extern struct { | ^ 1.ii:62:3: note: ‘ml_bssnrest_’ was previously declared here 62 | } ml_bssnrest_; | ^ Now I wonder why C++ FE makes the struct anonymous namespace when it is declared with extern "C". I have checked that type_in_anonymous_namespace_p(prevailing_type) returns true because mangled name is <anon> which comes from C++ FE. I will check in the patch to avoid ICE. Jason, can you please look if it is correct to consider these types anonymous?