PR c++/84770 - ICE with typedef and parameter pack.

* pt.c (verify_unstripped_args_1): Split out from
	verify_unstripped_args.

From-SVN: r258408
This commit is contained in:
Jason Merrill 2018-03-09 22:34:37 -05:00 committed by Jason Merrill
parent 732a431dc9
commit 7ed12599fa
3 changed files with 35 additions and 16 deletions

View File

@ -1,5 +1,9 @@
2018-03-09 Jason Merrill <jason@redhat.com>
PR c++/84770 - ICE with typedef and parameter pack.
* pt.c (verify_unstripped_args_1): Split out from
verify_unstripped_args.
PR c++/84785 - ICE with alias template and default targs.
* pt.c (type_unification_real): Set processing_template_decl if
saw_undeduced == 1.

View File

@ -1133,27 +1133,32 @@ optimize_specialization_lookup_p (tree tmpl)
/* Make sure ARGS doesn't use any inappropriate typedefs; we should have
gone through coerce_template_parms by now. */
static void
verify_unstripped_args_1 (tree inner)
{
for (int i = 0; i < TREE_VEC_LENGTH (inner); ++i)
{
tree arg = TREE_VEC_ELT (inner, i);
if (TREE_CODE (arg) == TEMPLATE_DECL)
/* OK */;
else if (TYPE_P (arg))
gcc_assert (strip_typedefs (arg, NULL) == arg);
else if (ARGUMENT_PACK_P (arg))
verify_unstripped_args_1 (ARGUMENT_PACK_ARGS (arg));
else if (strip_typedefs (TREE_TYPE (arg), NULL) != TREE_TYPE (arg))
/* Allow typedefs on the type of a non-type argument, since a
parameter can have them. */;
else
gcc_assert (strip_typedefs_expr (arg, NULL) == arg);
}
}
static void
verify_unstripped_args (tree args)
{
++processing_template_decl;
if (!any_dependent_template_arguments_p (args))
{
tree inner = INNERMOST_TEMPLATE_ARGS (args);
for (int i = 0; i < TREE_VEC_LENGTH (inner); ++i)
{
tree arg = TREE_VEC_ELT (inner, i);
if (TREE_CODE (arg) == TEMPLATE_DECL)
/* OK */;
else if (TYPE_P (arg))
gcc_assert (strip_typedefs (arg, NULL) == arg);
else if (strip_typedefs (TREE_TYPE (arg), NULL) != TREE_TYPE (arg))
/* Allow typedefs on the type of a non-type argument, since a
parameter can have them. */;
else
gcc_assert (strip_typedefs_expr (arg, NULL) == arg);
}
}
verify_unstripped_args_1 (INNERMOST_TEMPLATE_ARGS (args));
--processing_template_decl;
}

View File

@ -0,0 +1,10 @@
// PR c++/84770
// { dg-do compile { target c++11 } }
typedef int T;
template<T&...> struct A {};
int i;
A<i> a;