From: Nathan Sidwell Date: Tue, 29 Feb 2000 10:29:52 +0000 (+0000) Subject: pt.c (fn_type_unification): Unify return type, whenever provided. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8d3631f8a345db1d5d5301a62618004b339a4dec;p=gcc.git pt.c (fn_type_unification): Unify return type, whenever provided. * pt.c (fn_type_unification): Unify return type, whenever provided. (get_bindings_real): Only pass return type when necessary. Remove explicit return type check. * class.c (resolve_address_of_overloaded_function): Pass desired return type to fn_type_unification. From-SVN: r32253 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index afe076b52ca..cfbc6f55c9a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2000-02-29 Nathan Sidwell + + * pt.c (fn_type_unification): Unify return type, whenever + provided. + (get_bindings_real): Only pass return type when necessary. + Remove explicit return type check. + * class.c (resolve_address_of_overloaded_function): Pass desired + return type to fn_type_unification. + Mon Feb 28 08:15:23 2000 Richard Kenner * class.c (build_vtbl_or_vbase_field, check_methods): Don't clear diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 6f412903d61..3f922ef4210 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5829,6 +5829,7 @@ resolve_address_of_overloaded_function (target_type, { tree target_fn_type; tree target_arg_types; + tree target_ret_type; tree fns; if (is_ptrmem) @@ -5837,6 +5838,7 @@ resolve_address_of_overloaded_function (target_type, else target_fn_type = TREE_TYPE (target_type); target_arg_types = TYPE_ARG_TYPES (target_fn_type); + target_ret_type = TREE_TYPE (target_fn_type); for (fns = overload; fns; fns = OVL_CHAIN (fns)) { @@ -5858,7 +5860,7 @@ resolve_address_of_overloaded_function (target_type, /* Try to do argument deduction. */ targs = make_tree_vec (DECL_NTPARMS (fn)); if (fn_type_unification (fn, explicit_targs, targs, - target_arg_types, NULL_TREE, + target_arg_types, target_ret_type, DEDUCE_EXACT) != 0) /* Argument deduction failed. */ continue; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f909c8cb62d..64b48c44212 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7562,12 +7562,18 @@ fn_type_unification (fn, explicit_targs, targs, args, return_type, if (DECL_CONV_FN_P (fn)) { - /* This is a template conversion operator. Use the return types - as well as the argument types. We use it instead of 'this', since + /* This is a template conversion operator. Remove `this', since we could be comparing conversions from different classes. */ - parms = tree_cons (NULL_TREE, TREE_TYPE (fntype), - TREE_CHAIN (parms)); - args = tree_cons (NULL_TREE, return_type, TREE_CHAIN (args)); + parms = TREE_CHAIN (parms); + args = TREE_CHAIN (args); + my_friendly_assert (return_type != NULL_TREE, 20000227); + } + + if (return_type) + { + /* We've been given a return type to match, prepend it. */ + parms = tree_cons (NULL_TREE, TREE_TYPE (fntype), parms); + args = tree_cons (NULL_TREE, return_type, args); } /* We allow incomplete unification without an error message here @@ -8793,22 +8799,13 @@ get_bindings_real (fn, decl, explicit_args, check_rettype) i = fn_type_unification (fn, explicit_args, targs, decl_arg_types, - TREE_TYPE (decl_type), + (check_rettype || DECL_CONV_FN_P (fn) + ? TREE_TYPE (decl_type) : NULL_TREE), DEDUCE_EXACT); if (i != 0) return NULL_TREE; - if (check_rettype) - { - /* Check to see that the resulting return type is also OK. */ - tree t = tsubst (TREE_TYPE (TREE_TYPE (fn)), targs, - /*complain=*/0, NULL_TREE); - - if (!same_type_p (t, TREE_TYPE (TREE_TYPE (decl)))) - return NULL_TREE; - } - return targs; }