aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-01-26 12:10:24 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-01-26 12:10:24 -0500
commit41d733d943d25c83fffe587145271b6669e87984 (patch)
tree66c963b648f8be5106283b37c8e2ede45d3ec455
parenta011292a9e0c4fc64738237f01a0fd03ff07a6ae (diff)
downloadgcc-41d733d943d25c83fffe587145271b6669e87984.zip
gcc-41d733d943d25c83fffe587145271b6669e87984.tar.gz
gcc-41d733d943d25c83fffe587145271b6669e87984.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c6
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic8.C13
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fd3ff71..70b0134 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2018-01-26 Jason Merrill <jason@redhat.com>
+ 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 de8ad94..6c5d06b 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 0000000..7740d66
--- /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);
+}