PR c++/71833 - member template with two parameter packs
authorJason Merrill <jason@redhat.com>
Mon, 25 Jul 2016 19:10:41 +0000 (15:10 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 25 Jul 2016 19:10:41 +0000 (15:10 -0400)
PR c++/54440
* pt.c (coerce_template_parameter_pack): Fix logic for
pack index.

From-SVN: r238731

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/variadic-nested1.C [new file with mode: 0644]

index 5854205b3b7582f255e24c6aa72e7ecf785b5c54..9ae7e67eb21902876b4e5729880f692396f819c0 100644 (file)
@@ -1,5 +1,10 @@
 2016-07-25  Jason Merrill  <jason@redhat.com>
 
+       PR c++/71833
+       PR c++/54440
+       * pt.c (coerce_template_parameter_pack): Fix logic for
+       pack index.
+
        PR c++/65970
        * constexpr.c (cxx_eval_loop_expr): Count iterations.
        * cp-gimplify.c (genericize_cp_loop): Use start_locus even for
index a61f1c81a19ac5ff6026f6d203de917cc4bb245e..7dd6b25931d6ffad92e15deaf3b92abac22c4595 100644 (file)
@@ -7403,11 +7403,12 @@ coerce_template_parameter_pack (tree parms,
 
   /* Convert the remaining arguments, which will be a part of the
      parameter pack "parm".  */
+  int first_pack_arg = arg_idx;
   for (; arg_idx < nargs; ++arg_idx)
     {
       tree arg = TREE_VEC_ELT (inner_args, arg_idx);
       tree actual_parm = TREE_VALUE (parm);
-      int pack_idx = arg_idx - parm_idx;
+      int pack_idx = arg_idx - first_pack_arg;
 
       if (packed_parms)
         {
@@ -7436,12 +7437,12 @@ coerce_template_parameter_pack (tree parms,
       TREE_VEC_ELT (packed_args, pack_idx) = arg;
     }
 
-  if (arg_idx - parm_idx < TREE_VEC_LENGTH (packed_args)
+  if (arg_idx - first_pack_arg < TREE_VEC_LENGTH (packed_args)
       && TREE_VEC_LENGTH (packed_args) > 0)
     {
       if (complain & tf_error)
        error ("wrong number of template arguments (%d, should be %d)",
-              arg_idx - parm_idx, TREE_VEC_LENGTH (packed_args));
+              arg_idx - first_pack_arg, TREE_VEC_LENGTH (packed_args));
       return error_mark_node;
     }
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-nested1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-nested1.C
new file mode 100644 (file)
index 0000000..abfb49a
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/71833
+// { dg-do compile { target c++11 } }
+
+template < typename ... Ts > struct A 
+{
+  template < Ts ..., typename ... Us > struct B {};
+};
+
+A <>::B < int > e;