+2014-02-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/60167
+ PR c++/60222
+ PR c++/58606
+ * parser.c (cp_parser_template_argument): Restore dereference.
+ * pt.c (template_parm_to_arg): Dereference non-pack expansions too.
+ (process_partial_specialization): Handle deref.
+ (unify): Likewise.
+
2014-02-21 Adam Butcher <adam@jessamine.co.uk>
PR c++/60052
if (INDIRECT_REF_P (argument))
{
+ /* Strip the dereference temporarily. */
gcc_assert (REFERENCE_REF_P (argument));
argument = TREE_OPERAND (argument, 0);
}
if (address_p)
argument = build_x_unary_op (loc, ADDR_EXPR, argument,
tf_warning_or_error);
+ else
+ argument = convert_from_reference (argument);
return argument;
}
}
SET_ARGUMENT_PACK_ARGS (t, vec);
TREE_TYPE (t) = type;
}
+ else
+ t = convert_from_reference (t);
}
return t;
}
if (/* These first two lines are the `non-type' bit. */
!TYPE_P (arg)
&& TREE_CODE (arg) != TEMPLATE_DECL
- /* This next line is the `argument expression is not just a
+ /* This next two lines are the `argument expression is not just a
simple identifier' condition and also the `specialized
non-type argument' bit. */
- && TREE_CODE (arg) != TEMPLATE_PARM_INDEX)
+ && TREE_CODE (arg) != TEMPLATE_PARM_INDEX
+ && !(REFERENCE_REF_P (arg)
+ && TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_PARM_INDEX))
{
if ((!packed_args && tpd.arg_uses_template_parms[i])
|| (packed_args && uses_template_parms (arg)))
/* Unification fails if we hit an error node. */
return unify_invalid (explain_p);
+ case INDIRECT_REF:
+ if (REFERENCE_REF_P (parm))
+ return unify (tparms, targs, TREE_OPERAND (parm, 0), arg,
+ strict, explain_p);
+ /* FALLTHRU */
+
default:
/* An unresolved overload is a nondeduced context. */
if (is_overloaded_fn (parm) || type_unknown_p (parm))