Commit 92383a2a by Jason Merrill Committed by Jason Merrill

re PR c++/54437 (Revision 190664 causes Firefox build failure)

	PR c++/54437
	PR c++/51213
	* pt.c (fn_type_unification): Call coerce_template_parms before
	entering substitution context.

From-SVN: r190946
parent 178f875a
2012-09-04 Jason Merrill <jason@redhat.com>
PR c++/54437
PR c++/51213
* pt.c (fn_type_unification): Call coerce_template_parms before
entering substitution context.
2012-08-31 Paolo Carlini <paolo.carlini@oracle.com> 2012-08-31 Paolo Carlini <paolo.carlini@oracle.com>
Jason Merrill <jason@redhat.com> Jason Merrill <jason@redhat.com>
......
...@@ -14591,11 +14591,22 @@ fn_type_unification (tree fn, ...@@ -14591,11 +14591,22 @@ fn_type_unification (tree fn,
static int deduction_depth; static int deduction_depth;
struct pending_template *old_last_pend = last_pending_template; struct pending_template *old_last_pend = last_pending_template;
struct tinst_level *old_error_tinst = last_error_tinst_level; struct tinst_level *old_error_tinst = last_error_tinst_level;
tree tparms = DECL_INNERMOST_TEMPLATE_PARMS (fn);
tree tinst; tree tinst;
tree r = error_mark_node; tree r = error_mark_node;
if (excessive_deduction_depth) /* Adjust any explicit template arguments before entering the
return error_mark_node; substitution context. */
if (explicit_targs)
{
explicit_targs
= (coerce_template_parms (tparms, explicit_targs, NULL_TREE,
complain,
/*require_all_args=*/false,
/*use_default_args=*/false));
if (explicit_targs == error_mark_node)
return error_mark_node;
}
/* In C++0x, it's possible to have a function template whose type depends /* In C++0x, it's possible to have a function template whose type depends
on itself recursively. This is most obvious with decltype, but can also on itself recursively. This is most obvious with decltype, but can also
...@@ -14608,6 +14619,8 @@ fn_type_unification (tree fn, ...@@ -14608,6 +14619,8 @@ fn_type_unification (tree fn,
substitutions back up to the initial one. substitutions back up to the initial one.
This is, of course, not reentrant. */ This is, of course, not reentrant. */
if (excessive_deduction_depth)
return error_mark_node;
tinst = build_tree_list (fn, targs); tinst = build_tree_list (fn, targs);
if (!push_tinst_level (tinst)) if (!push_tinst_level (tinst))
{ {
...@@ -14640,23 +14653,10 @@ fn_type_unification (tree fn, ...@@ -14640,23 +14653,10 @@ fn_type_unification (tree fn,
specified template argument values. If a substitution in a specified template argument values. If a substitution in a
template parameter or in the function type of the function template parameter or in the function type of the function
template results in an invalid type, type deduction fails. */ template results in an invalid type, type deduction fails. */
tree tparms = DECL_INNERMOST_TEMPLATE_PARMS (fn);
int i, len = TREE_VEC_LENGTH (tparms); int i, len = TREE_VEC_LENGTH (tparms);
location_t loc = input_location; location_t loc = input_location;
tree converted_args;
bool incomplete = false; bool incomplete = false;
if (explicit_targs == error_mark_node)
goto fail;
converted_args
= (coerce_template_parms (tparms, explicit_targs, NULL_TREE,
complain,
/*require_all_args=*/false,
/*use_default_args=*/false));
if (converted_args == error_mark_node)
goto fail;
/* Substitute the explicit args into the function type. This is /* Substitute the explicit args into the function type. This is
necessary so that, for instance, explicitly declared function necessary so that, for instance, explicitly declared function
arguments can match null pointed constants. If we were given arguments can match null pointed constants. If we were given
...@@ -14667,7 +14667,7 @@ fn_type_unification (tree fn, ...@@ -14667,7 +14667,7 @@ fn_type_unification (tree fn,
{ {
tree parm = TREE_VALUE (TREE_VEC_ELT (tparms, i)); tree parm = TREE_VALUE (TREE_VEC_ELT (tparms, i));
bool parameter_pack = false; bool parameter_pack = false;
tree targ = TREE_VEC_ELT (converted_args, i); tree targ = TREE_VEC_ELT (explicit_targs, i);
/* Dig out the actual parm. */ /* Dig out the actual parm. */
if (TREE_CODE (parm) == TYPE_DECL if (TREE_CODE (parm) == TYPE_DECL
...@@ -14705,7 +14705,7 @@ fn_type_unification (tree fn, ...@@ -14705,7 +14705,7 @@ fn_type_unification (tree fn,
processing_template_decl += incomplete; processing_template_decl += incomplete;
input_location = DECL_SOURCE_LOCATION (fn); input_location = DECL_SOURCE_LOCATION (fn);
fntype = tsubst (TREE_TYPE (fn), converted_args, fntype = tsubst (TREE_TYPE (fn), explicit_targs,
complain | tf_partial, NULL_TREE); complain | tf_partial, NULL_TREE);
input_location = loc; input_location = loc;
processing_template_decl -= incomplete; processing_template_decl -= incomplete;
...@@ -14714,8 +14714,8 @@ fn_type_unification (tree fn, ...@@ -14714,8 +14714,8 @@ fn_type_unification (tree fn,
goto fail; goto fail;
/* Place the explicitly specified arguments in TARGS. */ /* Place the explicitly specified arguments in TARGS. */
for (i = NUM_TMPL_ARGS (converted_args); i--;) for (i = NUM_TMPL_ARGS (explicit_targs); i--;)
TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (converted_args, i); TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (explicit_targs, i);
} }
/* Never do unification on the 'this' parameter. */ /* Never do unification on the 'this' parameter. */
......
2012-09-04 Jason Merrill <jason@redhat.com>
PR c++/54437
* g++.dg/template/access24.C: New.
2012-09-04 Richard Guenther <rguenther@suse.de> 2012-09-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/54458 PR tree-optimization/54458
......
// PR c++/54437
template <void (*P)()> void f();
class A {
template <class T> static void g();
template <class T> static void h () { f<g<T> >(); }
static void i() { h<int>(); }
};
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