OSDN Git Service

* pt.c (fn_type_unification): Unify return type, whenever
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Feb 2000 10:29:52 +0000 (10:29 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Feb 2000 10:29:52 +0000 (10:29 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@32253 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/pt.c

index afe076b..cfbc6f5 100644 (file)
@@ -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
index 6f41290..3f922ef 100644 (file)
@@ -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;
index f909c8c..64b48c4 100644 (file)
@@ -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;
 }