Hi Jason,
On 4 Feb 2025, at 1:10, Jason Merrill wrote:
> On 1/31/25 12:11 PM, Simon Martin wrote:
>> Hi Jason,
>>
>> On 27 Jan 2025, at 16:49, Jason Merrill wrote:
>>
>>> On 1/27/25 10:41 AM, Simon Martin wrote:
>>>> Hi Jason,
>>>>
>>>> On 17 Jan 2025, at 23:33, Jason Merrill wrote:
>>>>
>>>>> On 1/17/25 9:52 AM, Simon Martin wrote:
>>>>>> Hi Jason,
>>>>>>
>>>>>> On 16 Jan 2025, at 22:49, Jason Merrill wrote:
>>>>>>
>>>>>>> On 10/16/24 11:43 AM, Simon Martin wrote:
>>>>>>>> As you know the patch had to be reverted due to PR117114, that
>>>>>>>> highlighted a bunch of issues with comparing DECL_VINDEXes: it
>>>>>>>> might
>>>>>>>> give false positives in case of multiple inheritance (the case
>>>>>>>> in
>>
>>>>>>>> PR117114), but also if there’s single inheritance by the
>>>>
>>>>>>>> hierarchy
>>>>>>>> has
>>>>>>>> more than two levels (another issue I found while bootstrapping
>>>>>>>> with
>>>>>>>> rust enabled).
>>>>>>>
>>>>>>> Yes, relying on DECL_VINDEX equality was wrong, sorry to mislead
>>>>>>> you.
>>>>>>>
>>>>>>>> The attached updated patch introduces an overrides_p function,
>>>>>>>> based
>>>>>>>> on
>>>>>>>> the existing check_final_overrider, and uses it when the
>>>>>>>> signatures
>>>>
>>>>>>>> match.
>>>>>>>
>>>>>>> That seems unnecessary. It seems like removing that only breaks
>>>>>>> Woverloaded-virt11.C, and making that work again only requires
>>>>>>> bringing back the check that DECL_VINDEX (fndecl) is set (to any
>>>>>>> value). Or remembering that fndecl was a template, so it can't
>>>>>>> really
>>>>>>> have the same signature as a non-template, whatever
>>>>>>> same_signature_p
>>>>
>>>>>>> says.
>>>>>> That’s right, only Woverloaded-virt11.C fails without the
>>>>>> check_final_overrider call.
>>>>>>
>>>>>> Thanks for the suggestion to check whether fndecl is a template.
>>
>>>>>> This
>>>>>> is
>>>>>> what the updated attached patch does, successfully tested on
>>>>>> x86_64-pc-linux-gnu.
>>>>>>
>>>>>> OK for GCC 15? And if so, thoughts on backporting to release
>>>>>> branches
>>>>>> (technically it’s a regression but it’s “just” an
>>>>>> incorrect
>>>>>> warning fix, so probably not worth the risk)?
>>>>>
>>>>> Right, I wouldn't backport.
>>>>>
>>>>>> + if (warn_overloaded_virtual == 1
>>>>>> + && overrider_fndecls.elements () == num_fns)
>>>>>> + /* All the fns override a base virtual. */
>>>>>> + continue;
>>>>>
>>>>> This looks like the only use of the overrider_fndecls hash_set. A
>>>>> hash_set seems a bit overkill for checking whether everything in
>>>>> fns
>>
>>>>> is an overrider; keeping track of how many times the old
>>>>> any_override
>>>>> was set should work just as well?
>>>> Yeah you’re right :-/ I’ve changed my latest patch to simply
>>>> count
>>>> overriders.
>>>>
>>>>>> + /* fndecls hides base_fndecls[k]. */
>>>>>> + auto_vec<tree> &hiders =
>>>>>> + hidden_base_fndecls.get_or_insert
>>>>>> (base_fndecls[k]);
>>>>>> + if (!hiders.contains (fndecl))
>>>>>> + hiders.safe_push (fndecl);
>>>>>
>>>>> Hmm, do you think users want a full list of the overloads that
>>>>> don't
>>
>>>>> override? I'd think the problem is more the overload that doesn't
>>
>>>>> exist rather than the ones that do. The current code ends up in
>>>>> the
>>
>>>>> OVERLOAD handling of dump_decl that just prints scope::name.
>>>> Indeed, the full list is probably not super useful... One problem
>>>> with
>>>> the current code is that for conversion operators, it will give a
>>>> note
>>>> such as “note: by 'operator’”, so I propose to keep track
>>>> of
>>>> at
>>>> least one of the hiders, and use it to show the note (and get a
>>>> proper
>>>> “by 'virtual B::operator char()'” note for conversion
>>>> operators).
>>>>
>>>> Hence the updated patch, successfully tested on
>>>> x86_64-pc-linux-gnu.
>>>> Ok
>>>> for trunk?
>>>
>>>> + else if (!template_p /* Template methods don't override. */
>>>> + && same_signature_p (fndecl, base_fndecls[k]))
>>>> + {
>>>> + overriden_base_fndecls.add (base_fndecls[k]);
>>>> + ++num_overriders;
>>>> + }
>>>
>>> I'm concerned that this will increment num_overriders multiple times
>>> for a single fndecl if it overrides functions in multiple bases.
>> Such a case is covered by the new Woverloaded-virt11.C and does not
>> warn, but it’s true that we don’t take the “if
>> (warn_overloaded_virtual == 1 && num_overriders == num_fns)”
>> continue,
>> and we should - thanks.
>>
>> I have updated the patch to only increment num_overriders at the end
>> of
>> the loop iterating on base functions if we’ve seen at least one
>> overridden base function. Successfully tested on x86_64-pc-linux-gnu.
>> OK
>> for trunk?
>
>> @@ -3402,7 +3402,8 @@ location_of (tree t)
>> return input_location;
>> }
>> else if (TREE_CODE (t) == OVERLOAD)
>> - t = OVL_FIRST (t);
>> + t = OVL_FIRST (t) != conv_op_marker ? OVL_FIRST (t)
>> + : OVL_FIRST (OVL_CHAIN (t));
>
> Please add parentheses around the ?: expression to preserve the
> indentation. OK with that tweak.
Thanks, merged with the tweak as r15-7350-gd346af2af88caf.
Simon