diff options
author | Jason Merrill <jason@redhat.com> | 2025-04-10 14:34:35 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2025-04-10 16:10:02 -0400 |
commit | 5957b9919c9ecda6e4ca198086f8bb9ea215232c (patch) | |
tree | a86d58d88829b8616da6f7423b3f817fc8eea3da /gcc | |
parent | 733a6a4c1115080a0ee3cf7e6678c0fb9ffd0a56 (diff) | |
download | gcc-5957b9919c9ecda6e4ca198086f8bb9ea215232c.zip gcc-5957b9919c9ecda6e4ca198086f8bb9ea215232c.tar.gz gcc-5957b9919c9ecda6e4ca198086f8bb9ea215232c.tar.bz2 |
c++: nested lambda capture pack [PR119345]
tsubst_stmt already registers a local capture proxy as a
local_specialization of both an outer capture proxy and the captured
variable; we also need to do that in add_extra_args.
PR c++/119345
gcc/cp/ChangeLog:
* pt.cc (add_extra_args): Also register a specialization
of the captured variable.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/lambda-targ14.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/pt.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-targ14.C | 12 |
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 805b274..b7060b4 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -13748,6 +13748,8 @@ add_extra_args (tree extra, tree args, tsubst_flags_t complain, tree in_decl) inst = local; /* else inst is already a full instantiation of the pack. */ register_local_specialization (inst, gen); + if (is_normal_capture_proxy (gen)) + register_local_specialization (inst, DECL_CAPTURED_VARIABLE (gen)); } gcc_assert (!TREE_PURPOSE (extra)); extra = TREE_VALUE (extra); diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-targ14.C b/gcc/testsuite/g++.dg/cpp2a/lambda-targ14.C new file mode 100644 index 0000000..debb15e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-targ14.C @@ -0,0 +1,12 @@ +// PR c++/119345 +// { dg-do compile { target c++20 } } + +void f(auto... args) { + [args...]<int... i> { + (..., [args...] { i; }); + }.template operator()<0>(); +} + +int main() { + f(); +} |