c++: constexpr, union, and no_unique_address [PR98994]

My second patch for 97566 omits nested CONSTRUCTORs for empty fields, but we
do want them for empty union members.

gcc/cp/ChangeLog:

	PR c++/98994
	PR c++/97566
	* constexpr.c (cxx_eval_store_expression): Only skip empty fields in
	RECORD_TYPE.

gcc/testsuite/ChangeLog:

	PR c++/98994
	* g++.dg/cpp2a/no_unique_address12.C: New test.
This commit is contained in:
Jason Merrill 2021-02-08 15:56:11 -05:00
parent 2da7ce23cf
commit a8dd2b3e96
2 changed files with 13 additions and 1 deletions

View File

@ -5292,7 +5292,7 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
type = refs->pop();
tree index = refs->pop();
if (is_empty_field (index))
if (code == RECORD_TYPE && is_empty_field (index))
/* Don't build a sub-CONSTRUCTOR for an empty base or field, as they
have no data and might have an offset lower than previously declared
fields, which confuses the middle-end. The code below will notice

View File

@ -0,0 +1,12 @@
// PR c++/98994
// { dg-do compile { target c++20 } }
struct empty {};
union U {
constexpr U(): a() { }
[[no_unique_address]] empty a;
};
constexpr U u;