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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

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

commit r10-8723-gf63831405a32287dea2862ce3663675cc5b55180
Author: Marek Polacek <pola...@redhat.com>
Date:   Fri Sep 4 16:04:26 2020 -0400

    c++: Fix ICE in reshape_init with init-list [PR95164]

    This patch fixes a long-standing bug in reshape_init_r.  Since r209314
    we implement DR 1467 which handles list-initialization with a single
    initializer of the same type as the target.  In this test this causes
    a crash in reshape_init_r when we're processing a constructor that has
    undergone the DR 1467 transformation.

    Take e.g. the

      foo({{1, {H{k}}}});

    line in the attached test.  {H{k}} initializes the field b of H in I.
    H{k} is a functional cast, so has TREE_HAS_CONSTRUCTOR set, so is
    COMPOUND_LITERAL_P.  We perform the DR 1467 transformation and turn
    {H{k}} into H{k}.  Then we attempt to reshape H{k} again and since
    first_initializer_p is null and it's COMPOUND_LITERAL_P, we go here:

               else if (COMPOUND_LITERAL_P (stripped_init))
                 gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (stripped_init));

    then complain about the missing braces, go to reshape_init_class and ICE
    on
                   gcc_checking_assert (d->cur->index
                                        == get_class_binding (type, id));

    because due to the missing { } we're looking for 'b' in H, but that's
    not found.

    So we have to be prepared to handle an initializer whose outer braces
    have been removed due to DR 1467.

    gcc/cp/ChangeLog:

            PR c++/95164
            * decl.c (reshape_init_r): When initializing an aggregate member
            with an initializer from an initializer-list, also consider
            COMPOUND_LITERAL_P.

    gcc/testsuite/ChangeLog:

            PR c++/95164
            * g++.dg/cpp0x/initlist123.C: New test.

    (cherry picked from commit acbe30bbc884899da72df47d023ebde89f8f47f1)

Reply via email to