From 41d733d943d25c83fffe587145271b6669e87984 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 26 Jan 2018 12:10:24 -0500 Subject: [PATCH] PR c++/84036 - ICE with variadic capture. PR c++/82249 * pt.c (tsubst_pack_expansion): When optimizing a simple substitution, pull a single pack expansion out of its pack. From-SVN: r257101 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 6 ++++++ .../g++.dg/cpp1y/lambda-generic-variadic8.C | 13 +++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd3ff717403..70b01346e02 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2018-01-26 Jason Merrill + PR c++/84036 - ICE with variadic capture. + PR c++/82249 + * pt.c (tsubst_pack_expansion): When optimizing a simple + substitution, pull a single pack expansion out of its pack. + PR c++/82514 - ICE with local class in generic lambda. * pt.c (regenerated_lambda_fn_p): Remove. (enclosing_instantiation_of): Don't use it. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index de8ad94200a..6c5d06b9ebb 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11575,6 +11575,12 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, && TREE_PURPOSE (packs) == pattern) { tree args = ARGUMENT_PACK_ARGS (TREE_VALUE (packs)); + + /* If the argument pack is a single pack expansion, pull it out. */ + if (TREE_VEC_LENGTH (args) == 1 + && pack_expansion_args_count (args)) + return TREE_VEC_ELT (args, 0); + /* Types need no adjustment, nor does sizeof..., and if we still have some pack expansion args we won't do anything yet. */ if (TREE_CODE (t) == TYPE_PACK_EXPANSION diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic8.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic8.C new file mode 100644 index 00000000000..7740d660de2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic8.C @@ -0,0 +1,13 @@ +// PR c++/84036 +// { dg-do compile { target c++14 } } + +template < typename T > +auto f(T){ + [](auto ... i){ + [i ...]{}; + }; +} + +int main(){ + f(0); +} -- 2.30.2