[PATCH] c++, libstdc++, v2: Implement current_{function,class,namespace} metafn addition from P3795R2

Jason Merrill jason@redhat.com
Mon Mar 30 19:59:28 GMT 2026


On 3/28/26 12:54 PM, Jakub Jelinek wrote:
> On Fri, Mar 27, 2026 at 05:40:31PM +0100, Jakub Jelinek wrote:
>> The following patch implements addition of std::meta::current_function,
>> std::meta::current_class, std::meta::current_namespace metafunctions
>> from P3795R2 - Miscellaneous Reflection Cleanup paper.
> 
> Reposting as no longer RFC PATCH.
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2026-03-28  Jakub Jelinek  <jakub@redhat.com>
> 
> gcc/cp/
> 	* metafns.gperf (enum metafn_code): Add METAFN_CURRENT_FUNCTION,
> 	METAFN_CURRENT_CLASS and METAFN_CURRENT_NAMESPACE.
> 	(enum metafn_kind): Add METAFN_KIND_INFO_VOID.
> 	(current_function, current_class, current_namespace): New
> 	metafunctions.
> 	* pt.cc (value_dependent_expression_p): Make current_function(),
> 	current_class() and current_namespace() calls dependent if they
> 	are inside of template.
> 	* reflect.cc (current_scope, eval_current_function,
> 	eval_current_class, eval_current_namespace): New functions.
> 	(eval_access_context_current): Use current_scope.
> 	(process_metafunction): Handle METAFN_CURRENT_FUNCTION,
> 	METAFN_CURRENT_CLASS and METAFN_CURRENT_NAMESPACE.
> 	* metafns.h: Regenerate.
> gcc/testsuite/
> 	* g++.dg/reflect/current_function1.C: New test.
> 	* g++.dg/reflect/current_function2.C: New test.
> 	* g++.dg/reflect/current_class1.C: New test.
> 	* g++.dg/reflect/current_class2.C: New test.
> 	* g++.dg/reflect/current_namespace1.C: New test.
> libstdc++-v3/
> 	* include/std/meta (std::meta::current_function,
> 	std::meta::current_class, std::meta::current_namespace): New
> 	declarations.
> 	* src/c++23/std.cc.in: Export those 3.
> 
> --- gcc/cp/pt.cc.jj	2026-03-27 10:17:14.033332387 +0100
> +++ gcc/cp/pt.cc	2026-03-27 15:20:11.586883334 +0100
> @@ -29794,12 +29794,19 @@ value_dependent_expression_p (tree expre
>   	   is enclosed by a scope corresponding to a templated entity.  */
>   	if (flag_reflection
>   	    && fn
> -	    && metafunction_p (fn)
> -	    && id_equal (DECL_NAME (fn), "current")
> -	    && DECL_CLASS_SCOPE_P (fn)
> -	    && id_equal (TYPE_IDENTIFIER (DECL_CONTEXT (fn)),
> -			 "access_context"))
> -	  return true;
> +	    && metafunction_p (fn))
> +	  {
> +	    if (id_equal (DECL_NAME (fn), "current")
> +		&& DECL_CLASS_SCOPE_P (fn)
> +		&& id_equal (TYPE_IDENTIFIER (DECL_CONTEXT (fn)),
> +			     "access_context"))
> +	      return true;
> +	    /* Similarly for these 3 metafns.  */
> +	    if (id_equal (DECL_NAME (fn), "current_function")
> +		|| id_equal (DECL_NAME (fn), "current_class")
> +		|| id_equal (DECL_NAME (fn), "current_namespace"))

Optionally, I wonder about looking up the METAFN_ code rather than a 
bunch of id_equal?

> --- gcc/cp/reflect.cc.jj	2026-03-27 10:17:14.033332387 +0100
> +++ gcc/cp/reflect.cc	2026-03-27 15:51:18.122236375 +0100
> @@ -6236,11 +6236,11 @@ eval_reflect_constant_array (location_t
>     return get_reflection_raw (loc, decl);
>   }
>   
> -/* Process std::meta::access_context::current.  */
> +/* Return CURRENT-SCOPE(P).  */
>   
>   static tree
> -eval_access_context_current (location_t loc, const constexpr_ctx *ctx,
> -			     tree call, bool *non_constant_p)
> +current_scope (location_t loc, const constexpr_ctx *ctx, tree call,

There's already a current_scope in search.cc, this shouldn't have the 
same name.

> +/* Process std::meta::current_namespace.  */
> +
> +static tree
> +eval_current_namespace (location_t loc, const constexpr_ctx *ctx,
> +			tree call, bool *non_constant_p)
> +{
> +  tree scope = current_scope (loc, ctx, call, non_constant_p,
> +			      "std::meta::current_namespace");
> +  while (TREE_CODE (scope) != NAMESPACE_DECL)
> +    {
> +      if (DECL_P (scope))
> +	scope = CP_DECL_CONTEXT (scope);
> +      else
> +	scope = CP_TYPE_CONTEXT (scope);
> +    }

decl_namespace_context?

Jason



More information about the Libstdc++ mailing list