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

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

https://gcc.gnu.org/g:97014e4ada448aa8978b3cd14ed95e0e56f375d9

commit r10-9168-g97014e4ada448aa8978b3cd14ed95e0e56f375d9
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Aug 12 05:45:02 2020 -0400

    c++: Copy elision and [[no_unique_address]]. [PR93711]

    We don't elide a copy from a function returning a class by value into a
base
    because that can overwrite data laid out in the tail padding of the base
    class; we need to handle [[no_unique_address]] fields the same way, or we
    ICE when the middle-end wants to create a temporary object of a
    TYPE_NEEDS_CONSTRUCTING type.

    This means that we can't always express initialization of a field with
    INIT_EXPR from a TARGET_EXPR the way we usually do, so I needed
    to change several places that were assuming that was sufficient.

    This also fixes 90254, the same problem with C++17 aggregate initialization
    of a base.

    gcc/cp/ChangeLog:

            PR c++/90254
            PR c++/93711
            * cp-tree.h (unsafe_return_slot_p): Declare.
            * call.c (is_base_field_ref): Rename to unsafe_return_slot_p.
            (build_over_call): Check unsafe_return_slot_p.
            (build_special_member_call): Likewise.
            * init.c (expand_default_init): Likewise.
            * typeck2.c (split_nonconstant_init_1): Likewise.

    gcc/testsuite/ChangeLog:

            PR c++/90254
            PR c++/93711
            * g++.dg/cpp1z/aggr-base10.C: New test.
            * g++.dg/cpp2a/no_unique_address7.C: New test.
            * g++.dg/cpp2a/no_unique_address7a.C: New test.

Reply via email to