On Fri, Jun 12, 2026 at 10:01:34PM +0800, Wang Jinghao wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu.
> 
> -- >8 --
> eval_is_explicit_object_parameter() determines whether a parameter is
> an explicit object parameter by checking whether the passed-in tree
> node is the first parameter in its parameter chain. As described in
> the comment for maybe_update_funtion_parm(), if the sequence is

s/funtion/function/

> declaration -> reflection -> definition, the old PARM_DECL will be
> compared against the new PARM_DECL, causing the check to produce an
> incorrect result.
> Calling maybe_update_function_parm() before the comparison updates
> the old reflection to the new PARM_DECL in the chain, thereby
> avoiding this error.

Thanks, this patch looks good to me (though I can't approve it).
eval_has_default_argument uses the same maybe_update_function_parm
trick, and so it also can't use const_tree.

Since there's the Signed-off-by trailer, I assume you want to
contribute this patch under DCO
<https://gcc.gnu.org/dco.html>.

Thanks,

> gcc/cp/ChangeLog:
> 
>       * reflect.cc (eval_is_explicit_object_parameter): Call
>       maybe_update_function_parm before checking the parameter
>       against DECL_ARGUMENTS.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/reflect/is_explicit_object_parameter2.C: New test.
> 
> Signed-off-by: Wang Jinghao <[email protected]>
> ---
>  gcc/cp/reflect.cc                               | 10 ++++++----
>  .../reflect/is_explicit_object_parameter2.C     | 17 +++++++++++++++++
>  2 files changed, 23 insertions(+), 4 deletions(-)
>  create mode 100644 
> gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter2.C
> 
> diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
> index 673b79d0bde..2c2a5972222 100644
> --- a/gcc/cp/reflect.cc
> +++ b/gcc/cp/reflect.cc
> @@ -1828,11 +1828,13 @@ eval_is_data_member_spec (const_tree r, reflect_kind 
> kind)
>     object parameter.  Otherwise, false.  */
>  
>  static tree
> -eval_is_explicit_object_parameter (const_tree r, reflect_kind kind)
> +eval_is_explicit_object_parameter (tree r, reflect_kind kind)
>  {
> -  if (eval_is_function_parameter (r, kind) == boolean_true_node
> -      && r == DECL_ARGUMENTS (DECL_CONTEXT (r))
> -      && DECL_XOBJ_MEMBER_FUNCTION_P (DECL_CONTEXT (r)))
> +  if (eval_is_function_parameter (r, kind) == boolean_false_node)
> +    return boolean_false_node;
> +  r = maybe_update_function_parm (r);
> +  tree fn = DECL_CONTEXT (r);
> +  if (r == DECL_ARGUMENTS (fn) && DECL_XOBJ_MEMBER_FUNCTION_P (fn))
>      return boolean_true_node;
>    else
>      return boolean_false_node;
> diff --git a/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter2.C 
> b/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter2.C
> new file mode 100644
> index 00000000000..cc24e439bc8
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter2.C
> @@ -0,0 +1,17 @@
> +// { dg-do compile { target c++26 } }
> +// { dg-additional-options "-freflection" }
> +// Test std::meta::is_explicit_object_parameter.
> +
> +#include <meta>
> +
> +using namespace std::meta;
> +
> +struct S {
> +  void f (this S, int);
> +};
> +
> +constexpr auto p = parameters_of (^^S::f)[0];
> +
> +void S::f (this S, int) {}
> +
> +static_assert (is_explicit_object_parameter (p));
> -- 
> 2.52.0
> 

Marek

Reply via email to