Hi,
On 21/06/19 20:50, Jason Merrill wrote:
On 6/20/19 12:24 AM, Paolo Carlini wrote:
Hi,
this bug notices that the more aggressive de-virtualization check
that we have now in place (fixed c++/67184) doesn't work correctly
for the below reproducer, which involves a pure virtual: we
de-virtualize and the build fails at link-time. To cure this I
believe we simply want an additional DECL_PURE_VIRTUAL_P in the
condition.
I don't see why this bug would be specific to pure virtual functions,
so the fix also should not be. If S1::f is not pure virtual, I'd
expect that we wrongly devirtualize to it in the same way.
Devirtualizing the call in S4 is a good optimization, we're just
selecting the wrong function.
It seems like the issue here is that the using-declaration hides the
final overrider from lookup. So we need to work harder to find the
actual final overrider, perhaps by looking into the argtype vtable.
I see, thanks for the suggestion.
The issue seems rather tricky, then. For the time being I'm going to
revert the recent improvements. Probably I'm also going to unassign
myself, because I don't want to prevent somebody else more knowledgeable
than me in the area from contributing a good solution.
Thanks, Paolo.