From f026530a85c3d13aaebec5c4e96cd0a2f6ef4f17 Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Mon, 30 Apr 2018 17:21:25 -0400
Subject: [PATCH] PR c++/85305 - pack in lambda init-capture.

	* parser.c (cp_parser_initializer): Add subexpression_p parm; don't
	check_for_bare_parameter_packs in a subexpression.
	(cp_parser_lambda_introducer): Use it.

From-SVN: r259779
---
 gcc/cp/ChangeLog                          | 5 +++++
 gcc/cp/parser.c                           | 8 ++++----
 gcc/testsuite/g++.dg/cpp1z/fold-lambda2.C | 8 ++++++++
 3 files changed, 17 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1z/fold-lambda2.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1ab91588e6ca..95f77f4bf985 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
 2018-04-30  Jason Merrill  <jason@redhat.com>
 
+	PR c++/85305 - pack in lambda init-capture.
+	* parser.c (cp_parser_initializer): Add subexpression_p parm; don't
+	check_for_bare_parameter_packs in a subexpression.
+	(cp_parser_lambda_introducer): Use it.
+
 	PR c++/61982 - dead stores to destroyed objects.
 	* call.c (build_trivial_dtor_call): New, assigns a clobber.
 	(build_over_call, build_special_member_call): Use it.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d8ce28a6d61a..b839232bcbe0 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -2243,7 +2243,7 @@ static tree cp_parser_default_argument
 static void cp_parser_function_body
   (cp_parser *, bool);
 static tree cp_parser_initializer
-  (cp_parser *, bool *, bool *);
+  (cp_parser *, bool *, bool *, bool = false);
 static cp_expr cp_parser_initializer_clause
   (cp_parser *, bool *);
 static cp_expr cp_parser_braced_list
@@ -10358,7 +10358,7 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
 		     "lambda capture initializers "
 		     "only available with -std=c++14 or -std=gnu++14");
 	  capture_init_expr = cp_parser_initializer (parser, &direct,
-						     &non_constant);
+						     &non_constant, true);
 	  explicit_init_p = true;
 	  if (capture_init_expr == NULL_TREE)
 	    {
@@ -21860,7 +21860,7 @@ cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser,
 
 static tree
 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
-		       bool* non_constant_p)
+		       bool* non_constant_p, bool subexpression_p)
 {
   cp_token *token;
   tree init;
@@ -21907,7 +21907,7 @@ cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
       init = error_mark_node;
     }
 
-  if (check_for_bare_parameter_packs (init))
+  if (!subexpression_p && check_for_bare_parameter_packs (init))
     init = error_mark_node;
 
   return init;
diff --git a/gcc/testsuite/g++.dg/cpp1z/fold-lambda2.C b/gcc/testsuite/g++.dg/cpp1z/fold-lambda2.C
new file mode 100644
index 000000000000..e93f55f7fd83
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/fold-lambda2.C
@@ -0,0 +1,8 @@
+// PR c++/85305
+// { dg-additional-options -std=c++17 }
+
+template <int... Is>
+void foo()
+{
+  ([i = Is]{}(), ...); 
+}
-- 
GitLab