https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112601
--- Comment #8 from Sergei Trofimovich <slyfox at gcc dot gnu.org> ---
Looking at `can_inline_edge_p()` I noticed that generally `gcc` disallows
inlining callee's that call `comdat_local`:
static bool
can_inline_edge_p (struct cgraph_edge *e, bool report, bool early = false)
{
// ...
else if (callee->calls_comdat_local)
{
e->inline_failed = CIF_USES_COMDAT_LOCAL;
inlinable = false;
// ...
But in this case we effectively inadvertently do such an inlining as comdat
call becomes visible only after the inline.
I have a few calligraphy questions for Jan and Matrin:
1. Do I understand correctly that the rejection of `calls_comdat_local` inline
is a correctness requirement to avoid different definitions of a comdat symbol
in different translation units?
2. Given the above: should ipa-inline try to attempt to inline `emit()` into
`S::sm()`, or is it a violation of [2.]?
If the inline is forbidden it feels like `ipa-inline` should prevent inlining
of function with indirect unknown edges into the symbols with combat groups
like that.