[PATCH] c++, v3: Implement C++26 P3074R7 and CWG3189 - trivial unions [PR119059]
Jakub Jelinek
jakub@redhat.com
Thu May 21 15:48:23 GMT 2026
On Thu, May 21, 2026 at 05:28:03PM +0200, Jakub Jelinek wrote:
> > Before C++26, a non-trivial variant member ctor makes t's deleted, so I
> > guess triviality never mattered?
>
> For ctor with the exception of variant member with DMI, but then the default
> ctor is marked non-trivial because of
> if (trivial_p)
> *trivial_p = false;
> in the DECL_INITIAL (field) walk_field_subobs handling.
> So shall I turn this
> >
> > > + if (cxx_dialect < cxx26
> > > + || TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
>
> into
> if (TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
> ?
Tested incremental
--- gcc/cp/class.cc.jj 2026-05-20 22:41:11.372062501 +0200
+++ gcc/cp/class.cc 2026-05-21 17:35:59.834804002 +0200
@@ -3912,9 +3912,12 @@ check_field_decl (tree field,
|= TYPE_HAS_COMPLEX_MOVE_ASSIGN (type);
TYPE_HAS_COMPLEX_MOVE_CTOR (t) |= TYPE_HAS_COMPLEX_MOVE_CTOR (type);
/* In C++26, triviality of default ctor or dtor of a variant member
- doesn't matter for triviality of the t's default ctor or dtor. */
- if (cxx_dialect < cxx26
- || TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
+ doesn't matter for triviality of the t's default ctor or dtor.
+ Before C++26, non-trivial default ctor or dtor of a variant
+ member makes it deleted with the exception of default ctor
+ when DMI is present, but in that case default ctor is
+ non-trivial. */
+ if (TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
{
TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
|= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type);
and it didn't regress anything in
GXX_TESTSUITE_STDS=98,11,14,17,20,23,26 make -j32 -k check-g++
Jakub
More information about the Libstdc++
mailing list