https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95158

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jason Merrill <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:0ddb93ce77374004c49cdfbd748ba35867620cf1

commit r11-954-g0ddb93ce77374004c49cdfbd748ba35867620cf1
Author: Jason Merrill <ja...@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 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.

Reply via email to