On 2026/6/17 0:05, Marek Polacek wrote:
> 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.

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_function_parm(), if the sequence is
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
> 
Thanks for the review!
 
Adding Jakub to Cc.

Hi Jakub, this patch modifies the c++ reflection of
eval_is_explicit_object_parameter().
Could you please take a look at it?

Thanks,
Wang Jinghao

Reply via email to