https://gcc.gnu.org/g:104eb528c1c53f2e9de7e1c50a6d2840ef4be6fe
commit r17-454-g104eb528c1c53f2e9de7e1c50a6d2840ef4be6fe Author: Jason Merrill <[email protected]> Date: Sat May 9 05:15:01 2026 -0400 c++/reflection: add null_reflection_p I wanted to improve %E of info{}, and it seemed desirable to have a shorter way to spell this test. gcc/cp/ChangeLog: * reflect.cc (null_reflection_p): New. (splice): Use it. * error.cc (dump_expr): Use it. * cp-tree.h (null_reflection_p): Declare. gcc/testsuite/ChangeLog: * g++.dg/reflect/pr125007.C: Add info{} test. Diff: --- gcc/cp/cp-tree.h | 1 + gcc/cp/error.cc | 5 +++++ gcc/cp/reflect.cc | 11 ++++++++++- gcc/testsuite/g++.dg/reflect/pr125007.C | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 06dc5af49550..8a168f509d40 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -9524,6 +9524,7 @@ extern tree process_metafunction (const constexpr_ctx *, tree, tree, bool *, bool *, tree *); extern tree get_reflection (location_t, tree, reflect_kind = REFLECT_UNDEF); extern tree get_null_reflection () ATTRIBUTE_PURE; +extern bool null_reflection_p (const_tree) ATTRIBUTE_PURE; extern tree splice (tree); extern bool check_out_of_consteval_use (tree, bool = true); extern bool consteval_only_p (tree) ATTRIBUTE_PURE; diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc index a22c8ee113e8..c2fb6027c521 100644 --- a/gcc/cp/error.cc +++ b/gcc/cp/error.cc @@ -3471,6 +3471,11 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags) pp_right_paren (pp); break; default: + if (null_reflection_p (t)) + { + pp_cxx_ws_string (pp, "std::meta::info{}"); + break; + } pp_string (pp, "^^"); pp->set_padding (pp_none); if (DECL_P (h)) diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index ad4c77fab3eb..c8148d967263 100644 --- a/gcc/cp/reflect.cc +++ b/gcc/cp/reflect.cc @@ -267,6 +267,15 @@ get_null_reflection () return null_reflection; } +/* True iff T is a null reflection. */ + +bool +null_reflection_p (const_tree t) +{ + return (t && TREE_CODE (t) == REFLECT_EXPR + && REFLECT_EXPR_HANDLE (t) == unknown_type_node); +} + /* Do strip_typedefs on T, but only for types. */ static tree @@ -8533,7 +8542,7 @@ splice (tree refl) return error_mark_node; } - if (compare_reflections (refl, get_null_reflection ())) + if (null_reflection_p (refl)) { error_at (loc, "cannot splice a null reflection"); return error_mark_node; diff --git a/gcc/testsuite/g++.dg/reflect/pr125007.C b/gcc/testsuite/g++.dg/reflect/pr125007.C index 4ac0dfe03cc2..0939f940dfd6 100644 --- a/gcc/testsuite/g++.dg/reflect/pr125007.C +++ b/gcc/testsuite/g++.dg/reflect/pr125007.C @@ -44,3 +44,6 @@ void qux (int x, int y); static_assert (parameters_of (^^qux)[0] == parameters_of (^^qux)[1]); // { dg-error "static assertion failed" } // { dg-message "note: the comparison reduces to '\\\(parameters_of\\\(\\\^\\\^qux\\\(int, int\\\)\\\)\\\[0\\\] \\\{aka x\\\} == parameters_of\\\(\\\^\\\^qux\\\(int, int\\\)\\\)\\\[1\\\] \\\{aka y\\\}\\\)'" "" { target *-*-* } .-1 } + +static_assert (std::meta::info{} == ^^int); // { dg-error "static assertion failed" } +// { dg-message {note: the comparison reduces to '\(std::meta::info{} == \^\^int\)} "" { target *-*-* } .-1 }
