Hi, this patch fixes thinko and makes the type warned about to be output right. Thanks to Trevor for noticing that.
Bootstrapped/regtested x86_64-linux, comitted. Honza * ipa-devirt.c (odr_type_warn_count): Add type. (possible_polymorphic_call_targets): Set it. (ipa_devirt): Use it. Index: ipa-devirt.c =================================================================== --- ipa-devirt.c (revision 213518) +++ ipa-devirt.c (working copy) @@ -2518,6 +2518,7 @@ devirt_variable_node_removal_hook (varpo /* Record about how many calls would benefit from given type to be final. */ struct odr_type_warn_count { + tree type; int count; gcov_type dyn_count; }; @@ -2738,6 +2739,7 @@ possible_polymorphic_call_targets (tree if (binfo) matched_vtables.add (BINFO_VTABLE (binfo)); + /* Next walk recursively all derived types. */ if (context.speculative_maybe_derived_type) for (i = 0; i < speculative_outer_type->derived_types.length(); i++) @@ -2818,6 +2820,8 @@ possible_polymorphic_call_targets (tree final_warning_records->type_warnings[outer_type->id].count++; final_warning_records->type_warnings[outer_type->id].dyn_count += final_warning_records->dyn_count; + final_warning_records->type_warnings[outer_type->id].type + = outer_type->type; (*slot)->type_warning = outer_type->id + 1; } if (complete @@ -3274,12 +3278,12 @@ ipa_devirt (void) i < final_warning_records->type_warnings.length (); i++) if (final_warning_records->type_warnings[i].count) { - odr_type type = odr_types[i]; - warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (type->type)), + tree type = final_warning_records->type_warnings[i].type; + warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (type)), OPT_Wsuggest_final_types, "Declaring type %qD final " "would enable devirtualization of %i calls", - type->type, + type, final_warning_records->type_warnings[i].count); } }