c++: Fix FE devirt with diamond inheritance [PR95158]
authorJason Merrill <jason@redhat.com>
Thu, 4 Jun 2020 03:50:06 +0000 (23:50 -0400)
committerJason Merrill <jason@redhat.com>
Thu, 4 Jun 2020 19:11:42 +0000 (15:11 -0400)
commit0ddb93ce77374004c49cdfbd748ba35867620cf1
treee72f9c9d166a469f442772331639a2fbf04ee818
parent8c727bdf4acf28c8315b119a1c8f6d6af745c2af
c++: Fix FE devirt with diamond inheritance [PR95158]

This started breaking in GCC 8 because of the fix for PR15272; after that
change, we (correctly) remember the lookup from template parsing time that
found Base::foo through the non-dependent MiddleB base, and so we overlook
the overrider in MiddleA.  But given that, the devirtualization condition
from the fix for PR59031 is insufficient; we know that d has to be a
Derived, and we found Base::foo in Base, but forcing a non-virtual call
gets the wrong function.

Fixed by removing the PR59031 code that the PR67184 patch moved to
build_over_call, and instead looking up the overrider in BINFO_VIRTUALS.

gcc/cp/ChangeLog:

PR c++/95158
* class.c (lookup_vfn_in_binfo): New.
* call.c (build_over_call): Use it.
* cp-tree.h (resolves_to_fixed_type_p): Add default argument.
(lookup_vfn_in_binfo): Declare.

gcc/testsuite/ChangeLog:

PR c++/95158
* g++.dg/template/virtual5.C: New test.
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/testsuite/g++.dg/template/virtual5.C [new file with mode: 0644]