[Bug c++/95158] [8/9 Regression] Templates + Diamond Inheritance + Final = Pure Virtual Function Call
cvs-commit at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Nov 24 17:57:48 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95158
--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-8 branch has been updated by Jason Merrill
<jason@gcc.gnu.org>:
https://gcc.gnu.org/g:a2bdff4f24d9065791e6d8820004772b9fe0c4c1
commit r8-10637-ga2bdff4f24d9065791e6d8820004772b9fe0c4c1
Author: Jason Merrill <jason@redhat.com>
Date: Wed Jun 3 23:50:06 2020 -0400
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, 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.
(build_new_method_call_1): Don't set LOOKUP_NONVIRTUAL.
* 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.
More information about the Gcc-bugs
mailing list