From a8dd2b3e96590ceccead63d28fc91c956a5f1a73 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 8 Feb 2021 15:56:11 -0500 Subject: [PATCH] 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. --- gcc/cp/constexpr.c | 2 +- gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 1dbc2db9643..53567ad6f8b 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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 diff --git a/gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C b/gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C new file mode 100644 index 00000000000..761d2086516 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C @@ -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; -- 2.30.2