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