2016-12-14 Nathan Sidwell <nathan@acm.org>
PR c++/78701
* pt.c (type_unification_real): Check tsubst arg doesn't have
remaining template parms before converting it.
PR c++/78701
* g++.dg/cpp0x/pr78701.C: New.
===================================================================
@@ -18987,14 +18987,19 @@ type_unification_real (tree tparms,
if (DECL_P (parm))
input_location = DECL_SOURCE_LOCATION (parm);
arg = tsubst_template_arg (arg, full_targs, complain, NULL_TREE);
- arg = convert_template_argument (parm, arg, full_targs, complain,
- i, NULL_TREE);
+ if (!uses_template_parms (arg))
+ arg = convert_template_argument (parm, arg, full_targs, complain,
+ i, NULL_TREE);
+ else if (saw_undeduced < 2)
+ arg = NULL_TREE;
+ else
+ arg = error_mark_node;
input_location = save_loc;
*checks = get_deferred_access_checks ();
pop_deferring_access_checks ();
if (arg == error_mark_node)
return 1;
- else
+ else if (arg)
{
TREE_VEC_ELT (targs, i) = arg;
/* The position of the first default template argument,
@@ -19002,7 +19007,6 @@ type_unification_real (tree tparms,
Record that. */
if (!NON_DEFAULT_TEMPLATE_ARGS_COUNT (targs))
SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (targs, i);
- continue;
}
}
===================================================================
@@ -0,0 +1,9 @@
+// PR c++/58707
+// { dg-do compile { target c++11 } }
+
+// ICE during deduction of default parms
+
+template <class T, T N = T(), bool B = N>
+ void f(T x) {}
+
+template void f<int> (int);