On Mon, 15 Sep 2025, Eczbek wrote:

> From d70ac2b0a7b524829d22b3bb6bacbe1ef381c7fb Mon Sep 17 00:00:00 2001
> From: Eczbek <[email protected]>
> Date: Mon, 15 Sep 2025 19:37:20 -0400
> Subject: [PATCH] c++: Fix lambdas with variadic parameters and static
>  specifier [PR119048]
> 
>       PR c++/119048
> 
> gcc/cp/ChangeLog:
> 
>       * lambda.cc (compare_lambda_sig): Only skip first parameter for
>       object members.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/cpp23/static-operator-call8.C: New test.
> 
> Signed-off-by: Eczbek <[email protected]>
> ---
>  gcc/cp/lambda.cc                                   | 12 ++++++++----
>  gcc/testsuite/g++.dg/cpp23/static-operator-call8.C |  6 ++++++
>  2 files changed, 14 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/cpp23/static-operator-call8.C
> 
> diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
> index 711e3b7a18e..8950404ae1d 100644
> --- a/gcc/cp/lambda.cc
> +++ b/gcc/cp/lambda.cc
> @@ -1742,10 +1742,14 @@ compare_lambda_sig (tree fn_a, tree fn_b)
>        || fn_b == error_mark_node)
>      return false;
> 
> -  for (tree args_a = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn_a))),
> -      args_b = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn_b)));
> -       args_a || args_b;
> -       args_a = TREE_CHAIN (args_a), args_b = TREE_CHAIN (args_b))
> +  tree args_a = TYPE_ARG_TYPES (TREE_TYPE (fn_a));
> +  if (DECL_OBJECT_MEMBER_FUNCTION_P (fn_a))
> +      args_a = TREE_CHAIN (args_a);

Thanks for the patch!

This definitely seems like an improvement to the current buggy code, but
I think we really only want to skip implicit object parameters since we
should consider explicit object parameters part of the lambda signature
and thus compare them.  Does checking DECL_IOBJ_MEMBER_FUNCTION_P
instead work?

> +  tree args_b = TYPE_ARG_TYPES (TREE_TYPE (fn_b));
> +  if (DECL_OBJECT_MEMBER_FUNCTION_P (fn_b))
> +      args_b = TREE_CHAIN (args_b);
> +  for (; args_a || args_b;
> +     args_a = TREE_CHAIN (args_a), args_b = TREE_CHAIN (args_b))
>      {
>        if (!args_a || !args_b)
>       return false;
> diff --git a/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C
> b/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C
> new file mode 100644
> index 00000000000..46aa6b42ce8
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C
> @@ -0,0 +1,6 @@
> +// PR c++/119048
> +// { dg-do compile { target c++23 } }
> +
> +int main() {
> +     [] {}, [](...) static {};
> +}
> -- 
> 2.51.0
> 
> 

Reply via email to