mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 14:37:30 +08:00
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
This commit is contained in:
parent
898d4b17a6
commit
8d3631f8a3
@ -1,3 +1,12 @@
|
||||
2000-02-29 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* 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 <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
* class.c (build_vtbl_or_vbase_field, check_methods): Don't clear
|
||||
|
@ -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;
|
||||
|
29
gcc/cp/pt.c
29
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user