From: Jason Merrill Date: Fri, 26 Jan 2018 17:10:24 +0000 (-0500) Subject: PR c++/84036 - ICE with variadic capture. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=41d733d943d25c83fffe587145271b6669e87984;p=gcc.git 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 --- 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); +}