From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id 955403858439; Tue, 24 Jan 2023 22:12:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 955403858439 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1674598323; bh=gz/mzwJqhQXdL3upeLYV6Tz3FEBt9NykZFMa0UO+KzM=; h=From:To:Subject:Date:From; b=pbBZOJPk5+qsAEcgTOhsD20JpxgN3ckHWP9xdl+9pc+W5dawuwacmnLgeWrnUeVlR 9OYnvU2+aIqgoGW54sVjG2wNtwoHmdcVgOUCcjMTZBVKevmDNZCapYjnC4q1oN+0ho x032Eza9Y0Tz1aC/GfKqcNUtw+okwMUAqbbDZ/IA= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-5334] c++: static lambda in template [PR108526] X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/trunk X-Git-Oldrev: 1c407dc088231ba5f2cc63d9278f4b797db48de1 X-Git-Newrev: 39ade88fa1632c659c5c4ed065fa2b62d16a8670 Message-Id: <20230124221203.955403858439@sourceware.org> Date: Tue, 24 Jan 2023 22:12:03 +0000 (GMT) List-Id: https://gcc.gnu.org/g:39ade88fa1632c659c5c4ed065fa2b62d16a8670 commit r13-5334-g39ade88fa1632c659c5c4ed065fa2b62d16a8670 Author: Jason Merrill Date: Tue Jan 24 15:29:35 2023 -0500 c++: static lambda in template [PR108526] tsubst_lambda_expr uses build_memfn_type to build a METHOD_TYPE for the new lamba op(). This is not what we want for a C++23 static op(), but since we also use that METHOD_TYPE to communicate the closure type down to tsubst_function_decl, let's wait and turn it back at that point. PR c++/108526 gcc/cp/ChangeLog: * pt.cc (tsubst_function_decl): Handle static lambda. gcc/testsuite/ChangeLog: * g++.dg/cpp23/static-operator-call5.C: New test. Diff: --- gcc/cp/pt.cc | 5 +++++ gcc/testsuite/g++.dg/cpp23/static-operator-call5.C | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 2a4d03c5e47..51fc246ed71 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -14306,6 +14306,11 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, tree ctx = closure ? closure : DECL_CONTEXT (t); bool member = ctx && TYPE_P (ctx); + /* If this is a static lambda, remove the 'this' pointer added in + tsubst_lambda_expr now that we know the closure type. */ + if (lambda_fntype && DECL_STATIC_FUNCTION_P (t)) + lambda_fntype = static_fn_type (lambda_fntype); + if (member && !closure) ctx = tsubst_aggr_type (ctx, args, complain, t, /*entering_scope=*/1); diff --git a/gcc/testsuite/g++.dg/cpp23/static-operator-call5.C b/gcc/testsuite/g++.dg/cpp23/static-operator-call5.C new file mode 100644 index 00000000000..ae022d0b971 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp23/static-operator-call5.C @@ -0,0 +1,8 @@ +// PR c++/108526 +// { dg-do compile { target c++23 } } + +template void f() +{ + auto a = [] (auto x) static { return x; }; +} +template void f();