PR c++/84801 - ICE with unexpanded pack in lambda.
authorJason Merrill <jason@redhat.com>
Thu, 15 Mar 2018 03:49:07 +0000 (23:49 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 15 Mar 2018 03:49:07 +0000 (23:49 -0400)
We avoid complaining about unexpanded packs when inside a lambda,
since the lambda as a whole could be part of a pack expansion.
But that can only be true if the lambda is in a template context.

    * pt.c (check_for_bare_parameter_packs): Don't return early for a
lambda in non-template context.

From-SVN: r258548

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic15.C [new file with mode: 0644]

index fc124b440bba7d90bced78663efc22bd0f6113fb..4a526b9b3a055f50bd1daa66e6b9701c0d4a145d 100644 (file)
@@ -1,5 +1,9 @@
 2018-03-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/84801 - ICE with unexpanded pack in lambda.
+       * pt.c (check_for_bare_parameter_packs): Don't return early for a
+       lambda in non-template context.
+
        PR c++/81236 - auto variable and auto function
        * pt.c (tsubst_baselink): Update the type of the BASELINK after
        mark_used.
index 2ea5fc79a2c124536ef3f766c690a0384d16484f..32af3a4822e30f21e839d4948688a823688771fe 100644 (file)
@@ -4043,7 +4043,8 @@ check_for_bare_parameter_packs (tree t)
     return false;
 
   /* A lambda might use a parameter pack from the containing context.  */
-  if (current_class_type && LAMBDA_TYPE_P (current_class_type))
+  if (current_class_type && LAMBDA_TYPE_P (current_class_type)
+      && CLASSTYPE_TEMPLATE_INFO (current_class_type))
     return false;
 
   if (TREE_CODE (t) == TYPE_DECL)
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic15.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic15.C
new file mode 100644 (file)
index 0000000..1de7271
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/84801
+// { dg-do compile { target c++14 } }
+
+int v;
+int main() { [](auto... c) { v = c; }(1); } // { dg-error "not expanded" }