c++: no_unique_address and constexpr [PR112439]

Here, because we don't build a CONSTRUCTOR for an empty base, we were
wrongly marking the Foo CONSTRUCTOR as complete after initializing the Empty
member.  Fixed by checking empty_base here as well.

	PR c++/112439

gcc/cp/ChangeLog:

	* constexpr.cc (cxx_eval_store_expression): Check empty_base
	before marking a CONSTRUCTOR readonly.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/no_unique_address15.C: New test.
This commit is contained in:
Jason Merrill 2024-02-01 17:23:53 -05:00
parent 0b786ff38a
commit f499860990
2 changed files with 20 additions and 0 deletions

View file

@ -6694,6 +6694,7 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
object. Make a note of this fact by marking the CONSTRUCTOR
TREE_READONLY. */
if (TREE_CODE (t) == INIT_EXPR
&& !empty_base
&& TREE_CODE (*valp) == CONSTRUCTOR
&& TYPE_READONLY (type))
{

View file

@ -0,0 +1,19 @@
// PR c++/112439
// { dg-do compile { target c++14 } }
struct Empty {};
class Foo {
public:
constexpr Foo(int x, Empty y, int z) : a(x), b(y)
{
c = z;
}
private:
int a{};
[[no_unique_address]] Empty b{};
[[no_unique_address]] int c{};
};
constexpr Foo r{1, {}, 3};