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. 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