https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97565
--- Comment #1 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- If I change 'abort' name to 'foo' then test works fine: $ cat abort.cpp extern "C" void foo(void) { foo(); } $ cat main.cpp extern "C" void foo(void); int main(int argc, char * argv[]) { foo(); } $ cat o.res 2 main.o 2 203 3cd4d3b7ff8d0f59 PREVAILING_DEF main 206 3cd4d3b7ff8d0f59 RESOLVED_IR foo abort.o 1 191 2179600d205ec4af PREVAILING_DEF_IRONLY foo Looks like 'abort' is considered a builtin of some sort that conflicts with user's override in a way that breaks LTO streaming of type declaration.