On Tue, Aug 11, 2026 at 06:18:24PM +0200, Jakub Jelinek wrote: > Hi! > > We IMHO incorrectly leave TYPE_ALIGN of std::meta::info unset, so alignof on > it is 1. We should change that to the same as decltype (nullptr) and > void *.
Alignment of nullptr_t is the subject of CWG 2966, FWIW. I remember seeing some discussions where people weren't so happy about the proposed resolution. > As C++26 is heavily experimental, I wonder if it is fine to change it as is > or if we need to play with C++ ABI version. And whether we should change > 16.3 or leave it as is (I'd say leave 16 as is). I'd change this without -fabi-version changes. > Tested on x86_64-linux, ok for trunk? > > 2026-08-11 Jakub Jelinek <[email protected]> > > * reflect.cc (init_reflection): Also unitialize TYPE_UNSIGNED, s/unitialize/initialize/ > TYPE_PRECISION, TYPE_MODE and TYPE_ALIGN of meta_info_type_node. > > * g++.dg/reflect/info1.C: New test. > > --- gcc/cp/reflect.cc.jj 2026-08-07 22:59:40.798404066 +0200 > +++ gcc/cp/reflect.cc 2026-08-11 17:50:26.225408769 +0200 > @@ -65,6 +65,10 @@ init_reflection () > /* Make it a complete type. */ > TYPE_SIZE (meta_info_type_node) = bitsize_int (GET_MODE_BITSIZE > (ptr_mode)); > TYPE_SIZE_UNIT (meta_info_type_node) = size_int (GET_MODE_SIZE (ptr_mode)); > + TYPE_UNSIGNED (meta_info_type_node) = 1; > + TYPE_PRECISION (meta_info_type_node) = GET_MODE_BITSIZE (ptr_mode); > + SET_TYPE_MODE (meta_info_type_node, ptr_mode); > + SET_TYPE_ALIGN (meta_info_type_node, GET_MODE_ALIGNMENT (ptr_mode)); > /* Name it. */ > record_builtin_type (RID_MAX, "decltype(^^int)", meta_info_type_node); > > --- gcc/testsuite/g++.dg/reflect/info1.C.jj 2026-08-11 10:19:55.315702116 > +0200 > +++ gcc/testsuite/g++.dg/reflect/info1.C 2026-08-11 10:19:45.631707734 > +0200 > @@ -0,0 +1,6 @@ > +// { dg-do compile { target c++26 } } > +// { dg-additional-options "-freflection" } > + > +using info = decltype (^^::); > +static_assert (sizeof (info) == sizeof (void *)); > +static_assert (alignof (info) == alignof (void *)); > > Jakub > Marek
