]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Clear TARGET_EXPR_ELIDING_P when forced to use a copy constructor due to __no_un...
authorSimon Martin <simon@nasilyan.com>
Wed, 22 Jan 2025 09:44:32 +0000 (10:44 +0100)
committerSimon Martin <simon@nasilyan.com>
Wed, 22 Jan 2025 09:47:30 +0000 (10:47 +0100)
commite13e751d8144c9cfb7a9f1cd38119d1fa4ab38cf
treeb3b738d71c578e9282d4c3353acf6d1b007fb0cf
parent8c93a8aa67f12c8e03eb7fd90f671a03ae46935b
c++: Clear TARGET_EXPR_ELIDING_P when forced to use a copy constructor due to __no_unique_address__ [PR118199]

We currently fail with a checking assert upon the following valid code
when using -fno-elide-constructors

=== cut here ===
struct d { ~d(); };
d &b();
struct f {
  [[__no_unique_address__]] d e;
};
struct h : f  {
  h() : f{b()} {}
} i;
=== cut here ===

The problem is that split_nonconstant_init_1 detects that it cannot
elide the copy constructor due to __no_unique_address__ but does not
clear TARGET_EXPR_ELIDING_P, and due to -fno-elide-constructors, we trip
on a checking assert in cp_gimplify_expr.

This patch fixes this by making sure that we clear TARGET_EXPR_ELIDING_P
if we determine that we have to keep the copy constructor due to
__no_unique_address__. An alternative would be to just check for
elide_constructors in that assert, but I think it'd lose most of its
value if we did so.

PR c++/118199

gcc/cp/ChangeLog:

* typeck2.cc (split_nonconstant_init_1): Clear
TARGET_EXPR_ELIDING_P if we need to use a copy constructor
because of __no_unique_address__.

gcc/testsuite/ChangeLog:

* g++.dg/init/no-elide3.C: New test.
gcc/cp/typeck2.cc
gcc/testsuite/g++.dg/init/no-elide3.C [new file with mode: 0644]