Ping.
On Thu, Sep 05, 2024 at 06:32:28PM -0400, Marek Polacek wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14?
>
> -- >8 --
> 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.
> ---
> gcc/cp/init.cc | 8 +++++++-
> gcc/testsuite/g++.dg/cpp1z/decomp61.C | 28 +++++++++++++++++++++++++++
> 2 files changed, 35 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/g++.dg/cpp1z/decomp61.C
>
> diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc
> index be7fdb40dd6..f785015e477 100644
> --- a/gcc/cp/init.cc
> +++ b/gcc/cp/init.cc
> @@ -4958,7 +4958,13 @@ build_vec_init (tree base, tree maxindex, tree init,
> if (xvalue)
> from = move (from);
> if (direct_init)
> - from = build_tree_list (NULL_TREE, from);
> + {
> + /* Wrap the initializer in a CONSTRUCTOR so that
> + build_vec_init recognizes it as direct-initialization. */
> + from = build_constructor_single (init_list_type_node,
> + NULL_TREE, from);
> + CONSTRUCTOR_IS_DIRECT_INIT (from) = true;
> + }
> }
> else
> from = NULL_TREE;
> diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp61.C
> b/gcc/testsuite/g++.dg/cpp1z/decomp61.C
> new file mode 100644
> index 00000000000..ad0a20c1add
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp1z/decomp61.C
> @@ -0,0 +1,28 @@
> +// PR c++/102594
> +// { dg-do compile { target c++17 } }
> +
> +struct S {
> + S() {}
> +};
> +S arr1[2];
> +S arr2[2][1];
> +S arr3[1][1];
> +auto [m](arr3);
> +auto [n] = arr3;
> +
> +struct X {
> + int i;
> +};
> +
> +void
> +g (X x)
> +{
> + auto [a, b](arr2);
> + auto [c, d] = arr2;
> + auto [e, f] = (arr2);
> + auto [i, j](arr1);
> + auto [k, l] = arr1;
> + auto [m, n] = (arr1);
> + auto [z] = x;
> + auto [y](x);
> +}
>
> base-commit: b567e5ead5d54f022c57b48f31653f6ae6ece007
> --
> 2.46.0
>
Marek