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

--- 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:96e0370f4daef29b918aafcff68c7f5e4ef397fd

commit r15-3933-g96e0370f4daef29b918aafcff68c7f5e4ef397fd
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Sep 5 16:45:32 2024 -0400

    c++: ICE with structured bindings and m-d array [PR102594]

    We ICE in decay_conversion with this test:

      struct S {
        S() {}
      };
      S arr[1][1];
      auto [m](arr3);

    But not when the last line is:

      auto [n] = arr3;

    Therefore the difference is between copy- and direct-init.  In
    particular, in build_vec_init we have:

      if (direct_init)
        from = build_tree_list (NULL_TREE, from);

    and then we call build_vec_init again with init==from.  Then
    decay_conversion gets the TREE_LIST and it crashes.

    build_aggr_init has:

                  /* Wrap the initializer in a CONSTRUCTOR so that
build_vec_init
                     recognizes it as direct-initialization.  */
                  init = build_constructor_single (init_list_type_node,
                                                   NULL_TREE, init);
                  CONSTRUCTOR_IS_DIRECT_INIT (init) = true;

    so I propose to do the same in build_vec_init.

            PR c++/102594

    gcc/cp/ChangeLog:

            * init.cc (build_vec_init): Build up a CONSTRUCTOR to signal
            direct-initialization rather than a TREE_LIST.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1z/decomp61.C: New test.

    Reviewed-by: Jason Merrill <ja...@redhat.com>

Reply via email to