PR c++/71833 - member template with two parameter packs

PR c++/54440
	* pt.c (coerce_template_parameter_pack): Fix logic for
	pack index.

From-SVN: r238731
This commit is contained in:
Jason Merrill 2016-07-25 15:10:41 -04:00 committed by Jason Merrill
parent 5ec2cd9f66
commit fd8b207a76
3 changed files with 18 additions and 3 deletions

View File

@ -1,5 +1,10 @@
2016-07-25 Jason Merrill <jason@redhat.com> 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 PR c++/65970
* constexpr.c (cxx_eval_loop_expr): Count iterations. * constexpr.c (cxx_eval_loop_expr): Count iterations.
* cp-gimplify.c (genericize_cp_loop): Use start_locus even for * cp-gimplify.c (genericize_cp_loop): Use start_locus even for

View File

@ -7403,11 +7403,12 @@ coerce_template_parameter_pack (tree parms,
/* Convert the remaining arguments, which will be a part of the /* Convert the remaining arguments, which will be a part of the
parameter pack "parm". */ parameter pack "parm". */
int first_pack_arg = arg_idx;
for (; arg_idx < nargs; ++arg_idx) for (; arg_idx < nargs; ++arg_idx)
{ {
tree arg = TREE_VEC_ELT (inner_args, arg_idx); tree arg = TREE_VEC_ELT (inner_args, arg_idx);
tree actual_parm = TREE_VALUE (parm); tree actual_parm = TREE_VALUE (parm);
int pack_idx = arg_idx - parm_idx; int pack_idx = arg_idx - first_pack_arg;
if (packed_parms) if (packed_parms)
{ {
@ -7436,12 +7437,12 @@ coerce_template_parameter_pack (tree parms,
TREE_VEC_ELT (packed_args, pack_idx) = arg; 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) && TREE_VEC_LENGTH (packed_args) > 0)
{ {
if (complain & tf_error) if (complain & tf_error)
error ("wrong number of template arguments (%d, should be %d)", 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; return error_mark_node;
} }

View File

@ -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;