]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: empty base constexpr -fno-elide-ctors [PR105245]
authorJason Merrill <jason@redhat.com>
Tue, 12 Apr 2022 21:46:59 +0000 (17:46 -0400)
committerJason Merrill <jason@redhat.com>
Thu, 12 May 2022 21:15:19 +0000 (17:15 -0400)
The patch for 100111 extended our handling of empty base elision to the case
where the derived class has no other fields, but we still need to make sure
that there's some initializer for the derived object.

PR c++/105245
PR c++/100111

gcc/cp/ChangeLog:

* constexpr.c (cxx_eval_store_expression): Build a CONSTRUCTOR
as needed in empty base handling.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1y/constexpr-empty2.C: Add -fno-elide-constructors.

gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp1y/constexpr-empty2.C

index 28b0a88a6582f82f01b818a7505e6c8f754b669d..31af214a28c899e39aff8ddc9f56528a16c25642 100644 (file)
@@ -5149,6 +5149,12 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
     {
       /* See above on initialization of empty bases.  */
       gcc_assert (is_empty_class (TREE_TYPE (init)) && !lval);
+      if (!*valp)
+       {
+         /* But do make sure we have something in *valp.  */
+         *valp = build_constructor (type, NULL);
+         CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
+       }
       return init;
     }
   else
index 2acfa98364b495de85adb0374fdaaf14213acd53..9768b89904edfd0afc183effd74544606c810d00 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do compile { target c++14 } }
+// { dg-additional-options -fno-elide-constructors }
 
 struct A
 {