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
<ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:a2bdff4f24d9065791e6d8820004772b9fe0c4c1

commit r8-10637-ga2bdff4f24d9065791e6d8820004772b9fe0c4c1
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, 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.

Reply via email to