[gcc r16-7901] c++/reflection: fix return value of meta::extent [PR124368]
Marek Polacek
mpolacek@gcc.gnu.org
Wed Mar 4 23:38:45 GMT 2026
https://gcc.gnu.org/g:8db7ba7ffbf83c624b572e45c9525ad5740b8f54
commit r16-7901-g8db7ba7ffbf83c624b572e45c9525ad5740b8f54
Author: Marek Polacek <polacek@redhat.com>
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 <jakub@redhat.com>
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);
More information about the Gcc-cvs
mailing list