[RFC] c++/reflection: add null_reflection_p
Commit Message
Tested x86_64-pc-linux-gnu. Does the spelling in dump_expr make sense to you,
or would you prefer something else?
-- 8< --
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/cp/cp-tree.h | 1 +
gcc/cp/error.cc | 5 +++++
gcc/cp/reflect.cc | 10 +++++++++-
3 files changed, 15 insertions(+), 1 deletion(-)
base-commit: b1cd9bd9908b0f05430e74c5cc82927b39997c42
Comments
On Wed, May 06, 2026 at 02:18:06PM -0400, Jason Merrill wrote:
> --- a/gcc/cp/error.cc
> +++ b/gcc/cp/error.cc
> @@ -3331,6 +3331,11 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags)
>
> case REFLECT_EXPR:
> {
> + if (null_reflection_p (t))
> + {
> + pp_cxx_ws_string (pp, "std::info{}");
"std::meta::info{}"
Otherwise LGTM.
Jakub
On Wed, May 06, 2026 at 08:28:05PM +0200, Jakub Jelinek wrote:
> On Wed, May 06, 2026 at 02:18:06PM -0400, Jason Merrill wrote:
> > --- a/gcc/cp/error.cc
> > +++ b/gcc/cp/error.cc
> > @@ -3331,6 +3331,11 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags)
> >
> > case REFLECT_EXPR:
> > {
> > + if (null_reflection_p (t))
> > + {
> > + pp_cxx_ws_string (pp, "std::info{}");
>
> "std::meta::info{}"
>
> Otherwise LGTM.
Yeah, looks good with that fixed.
Marek
On 5/6/26 3:08 PM, Marek Polacek wrote:
> On Wed, May 06, 2026 at 08:28:05PM +0200, Jakub Jelinek wrote:
>> On Wed, May 06, 2026 at 02:18:06PM -0400, Jason Merrill wrote:
>>> --- a/gcc/cp/error.cc
>>> +++ b/gcc/cp/error.cc
>>> @@ -3331,6 +3331,11 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags)
>>>
>>> case REFLECT_EXPR:
>>> {
>>> + if (null_reflection_p (t))
>>> + {
>>> + pp_cxx_ws_string (pp, "std::info{}");
>>
>> "std::meta::info{}"
>>
>> Otherwise LGTM.
>
> Yeah, looks good with that fixed.
Thanks, pushing the attached.
@@ -9454,6 +9454,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;
@@ -3331,6 +3331,11 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags)
case REFLECT_EXPR:
{
+ if (null_reflection_p (t))
+ {
+ pp_cxx_ws_string (pp, "std::info{}");
+ break;
+ }
pp_string (pp, "^^");
tree h = REFLECT_EXPR_HANDLE (t);
if (DECL_P (h))
@@ -267,6 +267,14 @@ get_null_reflection ()
return null_reflection;
}
+/* True iff T is a null reflection. */
+
+bool
+null_reflection_p (const_tree t)
+{
+ return REFLECT_EXPR_HANDLE (t) == unknown_type_node;
+}
+
/* Do strip_typedefs on T, but only for types. */
static tree
@@ -8525,7 +8533,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;