When building MySQL 8.0.25 with GCC trunk and `enable-checking=release`, an
error related to devirtualization occurs:   `gcc_assert (symtab->state <
IPA_SSA || targets.length() <= len)` fails.
When `symtab->state == IPA_SSA`, certain types remain unadded to
`odr_types`, such as MySQL's `Protocol_change_notification` type. During
the first invocation of `possible_polymorphic_call_targets` in
`dump_possible_polymorphic_call_targets`, `odr_types` does not include
`Protocol_change_notification`. The second call to
possible_polymorphic_call_targets adds context.speculative_outer_type
(Protocol_change_notification) to odr_types. This is included in the result
of possible_polymorphic_call_targets, and targets.length()(1) <= len(0)
does not hold.
I'm wondering if `symtab->state == IPA_SSA` indicates that `odr_types` now
contains all types in the program at this stage. If so, this contradicts
the MySQL example. Since I'm unfamiliar with how `odr_types` is
constructed, it's not easy to analyze why `Protocol_change_notification`
isn't included in `odr_types` when `symtab->state == IPA_SSA`. I'd
appreciate your insights.

Thank you.

Reply via email to