On 19 Oct 2024, at 11:09, Simon Martin wrote:

> We currently ICE in checking mode with cxx_dialect < 17 on the 
> following
> valid code
>
> === cut here ===
> struct X {
>   X(const X&) {}
> };
> extern X x;
> void foo () {
>   new X[1]{x};
> }
> === cut here ===
>
> The problem is that cp_gimplify_expr gcc_checking_asserts that a
> TARGET_EXPR is not TARGET_EXPR_ELIDING_P (or cannot be elided), while 
> in
> this case with cxx_dialect < 17, it is TARGET_EXPR_ELIDING_P but we 
> have
> not even tried to elide.
>
> This patch relaxes that gcc_checking_assert to not fail when using
> cxx_dialect < 17 and -fno-elide-constructors (I considered being more
> clever at setting TARGET_EXPR_ELIDING_P appropriately but it looks 
> more
> risky and not worth the extra complexity for a checking assert).
>
> Successfully tested on x86_64-pc-linux-gnu.
Friendly ping. Thanks!

>
>       PR c++/114619
>
> gcc/cp/ChangeLog:
>
>       * cp-gimplify.cc (cp_gimplify_expr): Relax gcc_checking_assert
>       to support the usage of -fno-elide-constructors with c++ < 17.
>
> gcc/testsuite/ChangeLog:
>
>       * g++.dg/init/no-elide3.C: New test.
>
> ---
>  gcc/cp/cp-gimplify.cc                 |  7 ++++++-
>  gcc/testsuite/g++.dg/init/no-elide3.C | 11 +++++++++++
>  2 files changed, 17 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/init/no-elide3.C
>
> diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc
> index 003e68f1ea7..354ea73c63b 100644
> --- a/gcc/cp/cp-gimplify.cc
> +++ b/gcc/cp/cp-gimplify.cc
> @@ -908,7 +908,12 @@ cp_gimplify_expr (tree *expr_p, gimple_seq 
> *pre_p, gimple_seq *post_p)
>        gimplify_init_ctor_preeval can materialize subobjects of a 
> CONSTRUCTOR
>        on the rhs of an assignment, as in constexpr-aggr1.C.  */
>        gcc_checking_assert (!TARGET_EXPR_ELIDING_P (*expr_p)
> -                        || !TREE_ADDRESSABLE (TREE_TYPE (*expr_p)));
> +                        || !TREE_ADDRESSABLE (TREE_TYPE (*expr_p))
> +                        /* If we explicitly asked not to elide and it's not
> +                           required by the standard, we can't expect elision
> +                           to have happened.  */
> +                        || (cxx_dialect < cxx17
> +                            && !flag_elide_constructors));
>        ret = GS_UNHANDLED;
>        break;
>
> diff --git a/gcc/testsuite/g++.dg/init/no-elide3.C 
> b/gcc/testsuite/g++.dg/init/no-elide3.C
> new file mode 100644
> index 00000000000..9377d9f0161
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/init/no-elide3.C
> @@ -0,0 +1,11 @@
> +// PR c++/114619
> +// { dg-do "compile" { target c++11 } }
> +// { dg-options "-fno-elide-constructors" }
> +
> +struct X {
> +  X(const X&) {}
> +};
> +extern X x;
> +void foo () {
> +  new X[1]{x};
> +}
> -- 
> 2.44.0

Reply via email to