aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/constexpr.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-06-03 23:50:06 -0400
committerJason Merrill <jason@redhat.com>2020-06-04 15:11:42 -0400
commit0ddb93ce77374004c49cdfbd748ba35867620cf1 (patch)
treee72f9c9d166a469f442772331639a2fbf04ee818 /gcc/cp/constexpr.c
parent8c727bdf4acf28c8315b119a1c8f6d6af745c2af (diff)
downloadgcc-0ddb93ce77374004c49cdfbd748ba35867620cf1.zip
gcc-0ddb93ce77374004c49cdfbd748ba35867620cf1.tar.gz
gcc-0ddb93ce77374004c49cdfbd748ba35867620cf1.tar.bz2
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.
Diffstat (limited to 'gcc/cp/constexpr.c')
0 files changed, 0 insertions, 0 deletions