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 *.
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).

Tested on x86_64-linux, ok for trunk? 

2026-08-11  Jakub Jelinek  <[email protected]>

        * reflect.cc (init_reflection): Also unitialize TYPE_UNSIGNED,
        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

Reply via email to