static bool check_instantiated_args (tree, tree, tsubst_flags_t);
static int maybe_adjust_types_for_deduction (unification_kind_t, tree*, tree*);
static int type_unification_real (tree, tree, tree, tree,
- int, unification_kind_t);
+ int, unification_kind_t, int);
static void note_template_header (int);
static tree convert_nontype_argument_function (tree, tree);
static tree convert_nontype_argument (tree, tree);
event. */
result = type_unification_real (DECL_INNERMOST_TEMPLATE_PARMS (fn),
targs, parms, args, /*subr=*/0,
- strict);
+ strict, 0);
if (result == 0)
/* All is well so far. Now, check:
If SUBR is 1, we're being called recursively (to unify the
arguments of a function or method parameter of a function
- template). */
+ template). If IS_METHOD is true, XPARMS are the parms of a
+ member function, and special rules apply to cv qualification
+ deduction on the this parameter. */
static int
type_unification_real (tree tparms,
tree xparms,
tree xargs,
int subr,
- unification_kind_t strict)
+ unification_kind_t strict,
+ int is_method)
{
tree parm, arg;
int i;
template args from other function args. */
continue;
+ if (is_method)
+ {
+ /* The cv qualifiers on the this pointer argument must match
+ exactly. We cannot deduce a T as const X against a const
+ member function for instance. */
+ gcc_assert (TREE_CODE (parm) == POINTER_TYPE);
+ gcc_assert (TREE_CODE (arg) == POINTER_TYPE);
+ /* The restrict qualifier will be on the pointer. */
+ if (cp_type_quals (parm) != cp_type_quals (arg))
+ return 1;
+ parm = TREE_TYPE (parm);
+ arg = TREE_TYPE (arg);
+ if (cp_type_quals (parm) != cp_type_quals (arg))
+ return 1;
+
+ parm = TYPE_MAIN_VARIANT (parm);
+ arg = TYPE_MAIN_VARIANT (arg);
+ is_method = 0;
+ }
+
/* Conversions will be performed on a function argument that
corresponds with a function parameter that contains only
non-deducible template parameters and explicitly specified
TREE_TYPE (arg), UNIFY_ALLOW_NONE))
return 1;
return type_unification_real (tparms, targs, TYPE_ARG_TYPES (parm),
- TYPE_ARG_TYPES (arg), 1, DEDUCE_EXACT);
+ TYPE_ARG_TYPES (arg), 1, DEDUCE_EXACT,
+ TREE_CODE (parm) == METHOD_TYPE);
case OFFSET_TYPE:
/* Unify a pointer to member with a pointer to member function, which