Commit 7498239e by Jason Merrill Committed by Jason Merrill

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
parent d15364ce
2015-06-26 Jason Merrill <jason@redhat.com> 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 PR c++/66067
* mangle.c (write_nested_name): Limit TYPENAME_TYPE handling to * mangle.c (write_nested_name): Limit TYPENAME_TYPE handling to
TYPE_DECLs. TYPE_DECLs.
......
...@@ -1019,6 +1019,35 @@ optimize_specialization_lookup_p (tree tmpl) ...@@ -1019,6 +1019,35 @@ optimize_specialization_lookup_p (tree tmpl)
&& !DECL_FRIEND_P (DECL_TEMPLATE_RESULT (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 /* Retrieve the specialization (in the sense of [temp.spec] - a
specialization is either an instantiation or an explicit specialization is either an instantiation or an explicit
specialization) of TMPL for the given template ARGS. If there is specialization) of TMPL for the given template ARGS. If there is
...@@ -1052,13 +1081,7 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash) ...@@ -1052,13 +1081,7 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash)
? TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl)) ? TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl))
: template_class_depth (DECL_CONTEXT (tmpl)))); : template_class_depth (DECL_CONTEXT (tmpl))));
#ifdef ENABLE_CHECKING check_unstripped_args (args);
/* 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
if (optimize_specialization_lookup_p (tmpl)) if (optimize_specialization_lookup_p (tmpl))
{ {
......
// PR c++/66255
typedef int int_t;
template <int_t &>
struct S { };
int_t a;
S <a> b;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment