Commit cb77790a by Jason Merrill Committed by Jason Merrill

re PR c++/35255 ([DR 115] gcc does not do partial ordering on overloaded address resolution)

	PR c++/35255
	* pt.c (resolve_overloaded_unification): Fix DR 115 handling.

From-SVN: r175367
parent 40a812f0
2011-06-23 Jason Merrill <jason@redhat.com>
PR c++/35255
* pt.c (resolve_overloaded_unification): Fix DR 115 handling.
2011-06-23 Paolo Carlini <paolo.carlini@oracle.com> 2011-06-23 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44625 PR c++/44625
......
...@@ -14524,6 +14524,7 @@ resolve_overloaded_unification (tree tparms, ...@@ -14524,6 +14524,7 @@ resolve_overloaded_unification (tree tparms,
the affected templates before we try to unify, in case the the affected templates before we try to unify, in case the
explicit args will completely resolve the templates in question. */ explicit args will completely resolve the templates in question. */
int ok = 0;
tree expl_subargs = TREE_OPERAND (arg, 1); tree expl_subargs = TREE_OPERAND (arg, 1);
arg = TREE_OPERAND (arg, 0); arg = TREE_OPERAND (arg, 0);
...@@ -14538,7 +14539,7 @@ resolve_overloaded_unification (tree tparms, ...@@ -14538,7 +14539,7 @@ resolve_overloaded_unification (tree tparms,
++processing_template_decl; ++processing_template_decl;
subargs = get_bindings (fn, DECL_TEMPLATE_RESULT (fn), subargs = get_bindings (fn, DECL_TEMPLATE_RESULT (fn),
expl_subargs, /*check_ret=*/false); expl_subargs, /*check_ret=*/false);
if (subargs) if (subargs && !any_dependent_template_arguments_p (subargs))
{ {
elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE); elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE);
if (try_one_overload (tparms, targs, tempargs, parm, if (try_one_overload (tparms, targs, tempargs, parm,
...@@ -14549,8 +14550,16 @@ resolve_overloaded_unification (tree tparms, ...@@ -14549,8 +14550,16 @@ resolve_overloaded_unification (tree tparms,
++good; ++good;
} }
} }
else if (subargs)
++ok;
--processing_template_decl; --processing_template_decl;
} }
/* If no templates (or more than one) are fully resolved by the
explicit arguments, this template-id is a non-deduced context; it
could still be OK if we deduce all template arguments for the
enclosing call through other arguments. */
if (good != 1)
good = ok;
} }
else if (TREE_CODE (arg) != OVERLOAD else if (TREE_CODE (arg) != OVERLOAD
&& TREE_CODE (arg) != FUNCTION_DECL) && TREE_CODE (arg) != FUNCTION_DECL)
......
2011-06-23 Jason Merrill <jason@redhat.com>
PR c++/35255
* g++.dg/template/partial10.C: New.
* g++.dg/template/partial11.C: New.
2011-06-23 Jeff Law <law@redhat.com> 2011-06-23 Jeff Law <law@redhat.com>
PR middle-end/48770 PR middle-end/48770
......
// PR c++/35255, DR 115
// { dg-do link }
// 14.8.1: In contexts where deduction is done and fails, or in contexts
// where deduction is not done, if a template argument list is specified
// and it, along with any default template arguments, identifies a single
// function template specialization, then the template-id is an lvalue for
// the function template specialization.
template <class Fn> void def(Fn fn) {}
template <class T1, class T2> T2 fn(T1, T2);
template <class T1> int fn(T1) { }
int main()
{
def(fn<int>);
}
// DR 115
// 14.8.1: In contexts where deduction is done and fails, or in contexts
// where deduction is not done, if a template argument list is specified
// and it, along with any default template arguments, identifies a single
// function template specialization, then the template-id is an lvalue for
// the function template specialization.
// Here, deduction is not done to resolve fn<int> because the target type
// is a template parameter, so we resolve to the second template, and then
// the call to def fails because we deduce different values of Fn for the
// two function arguments.
template <class Fn> void def(Fn fn, Fn fn2);
template <class T1, class T2> T2 fn(T1, T2);
template <class T1> int fn(T1);
int f(int,int);
int main()
{
def(fn<int>,f); // { dg-error "" }
}
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