Hi, On 30 Oct 2024, at 11:46, Simon Martin wrote:
> 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! Friendly ping. Thanks! Simon > >> >> 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