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

Reply via email to