Hi, in the testcase bellow the comdat local function is inlined and inliner mistakely dissolve the whole comdat group. This is wrong and leads to ICE here, but it also may lead to undefined symbols due to groups being wrong.
Bootstrapped/regtested x86_64-linux, comitted. PR ipa/64988 * ipa-inline-transform.c (clone_inlined_nodes): Do not dissolve comdat groups. * g++.dg/torture/pr64988.C: New testcase. Index: ipa-inline-transform.c =================================================================== --- ipa-inline-transform.c (revision 221122) +++ ipa-inline-transform.c (working copy) @@ -213,7 +213,7 @@ clone_inlined_nodes (struct cgraph_edge For now we keep the ohter functions in the group in program until cgraph_remove_unreachable_functions gets rid of them. */ gcc_assert (!e->callee->global.inlined_to); - e->callee->dissolve_same_comdat_group_list (); + e->callee->remove_from_same_comdat_group (); if (e->callee->definition && inline_account_function_p (e->callee)) { @@ -243,7 +243,7 @@ clone_inlined_nodes (struct cgraph_edge } } else - e->callee->dissolve_same_comdat_group_list (); + e->callee->remove_from_same_comdat_group (); e->callee->global.inlined_to = inlining_into; Index: testsuite/g++.dg/torture/pr64988.C =================================================================== --- testsuite/g++.dg/torture/pr64988.C (revision 0) +++ testsuite/g++.dg/torture/pr64988.C (revision 0) @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-O -fdeclone-ctor-dtor" } +struct A { + virtual ~ A (); +}; + +struct B : virtual A {}; +struct C : virtual A {}; + +struct D : B, C {}; + +D d;