public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Jason Merrill <jason@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-746] c++: constexpr empty base redux [PR105622] Date: Tue, 24 May 2022 19:50:25 +0000 (GMT) [thread overview] Message-ID: <20220524195025.EE0973857B9A@sourceware.org> (raw) https://gcc.gnu.org/g:2540e2c604142889308857657d3510874955336a commit r13-746-g2540e2c604142889308857657d3510874955336a Author: Jason Merrill <jason@redhat.com> Date: Fri May 20 16:16:25 2022 -0400 c++: constexpr empty base redux [PR105622] Here calling the constructor for s.__size_ had ctx->ctor for s itself because cxx_eval_store_expression doesn't create a ctor for the empty field. Then cxx_eval_call_expression returned the s initializer, and my empty base overhaul in r13-160 got confused because the type of init is not an empty class. But that's OK, we should be checking the type of the original LHS instead. We also want to use initialized_type in the condition, in case init is an AGGR_INIT_EXPR. I spent quite a while working on more complex solutions before coming back to this simple one. PR c++/105622 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_store_expression): Adjust assert. Use initialized_type. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/no_unique_address14.C: New test. Diff: --- gcc/cp/constexpr.cc | 4 ++-- gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index 433fa767c03..0f1a43982d0 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -5916,15 +5916,15 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t, gcc_checking_assert (!*valp || (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (*valp), type))); if (empty_base || !(same_type_ignoring_top_level_qualifiers_p - (TREE_TYPE (init), type))) + (initialized_type (init), type))) { /* For initialization of an empty base, the original target will be *(base*)this, evaluation of which resolves to the object argument, which has the derived type rather than the base type. In this situation, just evaluate the initializer and return, since there's no actual data to store, and we didn't build a CONSTRUCTOR. */ + gcc_assert (is_empty_class (TREE_TYPE (target))); empty_base = true; - gcc_assert (is_empty_class (TREE_TYPE (init))); if (!*valp) { /* But do make sure we have something in *valp. */ diff --git a/gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C b/gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C new file mode 100644 index 00000000000..d3fcd4ad354 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C @@ -0,0 +1,19 @@ +// PR c++/105622 +// { dg-do compile { target c++20 } } + +struct empty { + empty() = default; + constexpr empty(int) { } +}; + +struct container { + empty __begin_ = {}; + [[no_unique_address]] empty __size_ = 0; +}; + +constexpr bool test() { + container s; + return true; +} +static_assert(test()); +
reply other threads:[~2022-05-24 19:50 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220524195025.EE0973857B9A@sourceware.org \ --to=jason@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).