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

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:1a05332bbac98a4c002bef3fb45a3ad9d56b3a71

commit r15-523-g1a05332bbac98a4c002bef3fb45a3ad9d56b3a71
Author: Marek Polacek <pola...@redhat.com>
Date:   Wed May 8 15:43:58 2024 -0400

    c++: ICE with reference NSDMI [PR114854]

    Here we crash on a cp_gimplify_expr/TARGET_EXPR assert:

          /* A TARGET_EXPR that expresses direct-initialization should have
been
             elided by cp_gimplify_init_expr.  */
          gcc_checking_assert (!TARGET_EXPR_DIRECT_INIT_P (*expr_p));

    the TARGET_EXPR in question is created for the NSDMI in:

      class Vector { int m_size; };
      struct S {
        const Vector &vec{};
      };

    where we first need to create a Vector{} temporary, and then bind the
    vec reference to it.  The temporary is represented by a TARGET_EXPR
    and it cannot be elided.  When we create an object of type S, we get

      D.2848 = {.vec=(const struct Vector &) &TARGET_EXPR <D.2840,
{.m_size=0}>}

    where the TARGET_EXPR is no longer direct-initializing anything.

    Fixed by not setting TARGET_EXPR_DIRECT_INIT_P in
convert_like_internal/ck_user.

            PR c++/114854

    gcc/cp/ChangeLog:

            * call.cc (convert_like_internal) <case ck_user>: Don't set
            TARGET_EXPR_DIRECT_INIT_P.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1y/nsdmi-aggr22.C: New test.

Reply via email to