diff options
author | Jason Merrill <jason@redhat.com> | 2011-06-23 22:13:41 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-06-23 22:13:41 -0400 |
commit | cb77790aafc1ce69fd150e8009eadefe54557c69 (patch) | |
tree | d76dad84020f51a76d267b47520602b7603875be /gcc/cp/pt.c | |
parent | 40a812f0d735b3efd410f455721fe5000ba9abb0 (diff) | |
download | gcc-cb77790aafc1ce69fd150e8009eadefe54557c69.zip gcc-cb77790aafc1ce69fd150e8009eadefe54557c69.tar.gz gcc-cb77790aafc1ce69fd150e8009eadefe54557c69.tar.bz2 |
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
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 08ce5af..b3dd85f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14524,6 +14524,7 @@ resolve_overloaded_unification (tree tparms, the affected templates before we try to unify, in case the explicit args will completely resolve the templates in question. */ + int ok = 0; tree expl_subargs = TREE_OPERAND (arg, 1); arg = TREE_OPERAND (arg, 0); @@ -14538,7 +14539,7 @@ resolve_overloaded_unification (tree tparms, ++processing_template_decl; subargs = get_bindings (fn, DECL_TEMPLATE_RESULT (fn), 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); if (try_one_overload (tparms, targs, tempargs, parm, @@ -14549,8 +14550,16 @@ resolve_overloaded_unification (tree tparms, ++good; } } + else if (subargs) + ++ok; --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 && TREE_CODE (arg) != FUNCTION_DECL) |