https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115359
Bug ID: 115359 Summary: ICE in warn_types_mismatch: lto1: internal compiler error: Segmentation fault Product: gcc Version: 14.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: a.horodniceanu at proton dot me Target Milestone: --- Given the two source files: a.cpp: ----- struct Foo { }; void bar(Foo foo); int main() { bar({}); } ---- a.d: ---- extern(C++): struct Foo { } void bar(Foo foo) { } ---- Compile them with: `g++ a.d a.cpp -flto -freport-bug`: ---- a.cpp:2:6: warning: ‘bar’ violates the C++ One Definition Rule [-Wodr] 2 | void bar(Foo foo); | ^ a.d:3:6: note: type mismatch in parameter 1 3 | void bar(Foo foo) { } | ^ lto1: internal compiler error: Segmentation fault 0x5654dba30e94 internal_error(char const*, ...) ???:0 0x5654dbaccbd1 xstrdup ???:0 0x5654da59f465 warn_types_mismatch(tree_node*, tree_node*, unsigned int, unsigned int) ???:0 0x5654da30d1e1 lto_symtab_merge_decls() ???:0 0x5654da3154a2 read_cgraph_and_symbols(unsigned int, char const**) ???:0 0x5654da2fdce6 lto_main() ???:0 Please submit a full bug report, with preprocessed source. Please include the complete backtrace with any bug report. See <https://bugs.gentoo.org/> for instructions. lto-wrapper: fatal error: g++ returned 1 exit status compilation terminated. /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: error: lto-wrapper failed collect2: error: ld returned 1 exit status ---- g++ --version: ---- g++ (Gentoo Hardened 14.1.1_p20240518 p1) 14.1.1 20240516 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ---- I think this can be fixed with: ---- diff --git a/gcc/ipa-devirt.cc b/gcc/ipa-devirt.cc index a7ce434bf..efeb3766c 100644 --- a/gcc/ipa-devirt.cc +++ b/gcc/ipa-devirt.cc @@ -1084,7 +1084,9 @@ warn_types_mismatch (tree t1, tree t2, location_t loc1, location_t loc2) if (odr1 != NULL && odr2 != NULL && odr1 != odr2) { const int opts = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES; - char *name1 = xstrdup (cplus_demangle (odr1, opts)); + char *name1 = cplus_demangle (odr1, opts); + if (name1) + name1 = xstrdup(name1); char *name2 = cplus_demangle (odr2, opts); if (name1 && name2 && strcmp (name1, name2)) { ---- but I'm not sure if cplus_demangle failing to demangle the D symbol is the real problem.