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

Reply via email to