re PR c++/66255 (ice in retrieve_specialization)

PR c++/66255
	* pt.c (check_unstripped_args): Split out from...
	(retrieve_specialization): ...here.  Allow typedefs in the type of
	a non-type argument.

From-SVN: r225084
This commit is contained in:
Jason Merrill 2015-06-26 16:33:46 -04:00 committed by Jason Merrill
parent d15364ce85
commit 7498239e97
3 changed files with 44 additions and 7 deletions

View File

@ -1,5 +1,10 @@
2015-06-26 Jason Merrill <jason@redhat.com>
PR c++/66255
* pt.c (check_unstripped_args): Split out from...
(retrieve_specialization): ...here. Allow typedefs in the type of
a non-type argument.
PR c++/66067
* mangle.c (write_nested_name): Limit TYPENAME_TYPE handling to
TYPE_DECLs.

View File

@ -1019,6 +1019,35 @@ optimize_specialization_lookup_p (tree tmpl)
&& !DECL_FRIEND_P (DECL_TEMPLATE_RESULT (tmpl)));
}
/* Make sure ARGS doesn't use any inappropriate typedefs; we should have
gone through coerce_template_parms by now. */
static void
check_unstripped_args (tree args)
{
#ifdef ENABLE_CHECKING
++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);
}
}
--processing_template_decl;
#endif
}
/* Retrieve the specialization (in the sense of [temp.spec] - a
specialization is either an instantiation or an explicit
specialization) of TMPL for the given template ARGS. If there is
@ -1052,13 +1081,7 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash)
? TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl))
: template_class_depth (DECL_CONTEXT (tmpl))));
#ifdef ENABLE_CHECKING
/* We should have gone through coerce_template_parms by now. */
++processing_template_decl;
if (!any_dependent_template_arguments_p (args))
gcc_assert (strip_typedefs_expr (args, NULL) == args);
--processing_template_decl;
#endif
check_unstripped_args (args);
if (optimize_specialization_lookup_p (tmpl))
{

View File

@ -0,0 +1,9 @@
// PR c++/66255
typedef int int_t;
template <int_t &>
struct S { };
int_t a;
S <a> b;