https://gcc.gnu.org/g:8db7ba7ffbf83c624b572e45c9525ad5740b8f54
commit r16-7901-g8db7ba7ffbf83c624b572e45c9525ad5740b8f54 Author: Marek Polacek <[email protected]> Date: Wed Mar 4 17:32:14 2026 -0500 c++/reflection: fix return value of meta::extent [PR124368] std::meta::extent returns a size_t, but eval_extent returns either size_zero_node or size_binop(), both of which are of type sizetype, which is not the C/C++ size_t and so we don't pass the check in cxx_eval_outermost_constant_expr: /* Check we are not trying to return the wrong type. */ if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (r))) We should convert to size_type_node which represents the C/C++ size_t, like for instance fold_sizeof_expr does. PR c++/124368 gcc/cp/ChangeLog: * reflect.cc (eval_extent): Convert the result to size_type_node. gcc/testsuite/ChangeLog: * g++.dg/reflect/extent1.C: New test. Reviewed-by: Jakub Jelinek <[email protected]> Diff: --- gcc/cp/reflect.cc | 10 +++++++--- gcc/testsuite/g++.dg/reflect/extent1.C | 9 +++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index 6d15db8ae7da..90bac5baa021 100644 --- a/gcc/cp/reflect.cc +++ b/gcc/cp/reflect.cc @@ -4693,12 +4693,16 @@ eval_extent (location_t loc, tree type, tree i) --rank; type = TREE_TYPE (type); } + tree r; if (rank || TREE_CODE (type) != ARRAY_TYPE || eval_is_bounded_array_type (loc, type) == boolean_false_node) - return size_zero_node; - return size_binop (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (type)), - size_one_node); + r = size_zero_node; + else + r = size_binop (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (type)), + size_one_node); + /* std::meta::extent returns a value of type size_t. */ + return cp_fold_convert (size_type_node, r); } /* Process std::meta::is_same_type. */ diff --git a/gcc/testsuite/g++.dg/reflect/extent1.C b/gcc/testsuite/g++.dg/reflect/extent1.C new file mode 100644 index 000000000000..e7c823873d75 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/extent1.C @@ -0,0 +1,9 @@ +// PR c++/124368 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +#include <meta> + +using T = int[extent(^^int[4])]; +constexpr auto n = extent(^^int[4]); +static_assert (n == 4);
