diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2fe1fa932b0e1b5395dd74c2cf5bb2a5abd3ee1d..a586432024cd5303bd66b31dd39604abad9c8639 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+Thu Mar 19 11:51:58 1998  Jason Merrill  <jason@yorick.cygnus.com>
+
+	* pt.c (get_bindings_real): Rename from get_bindings.  Add 
+	check_rettype parm.
+	(get_bindings): Pass 1.
+	(get_bindings_overload): Pass 0.
+
 Wed Mar 19 09:08:12 1998  Mark Mitchell  <mmitchell@usa.net>
 
 	* pt.c (check_explicit_specialization): When reverting a static
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 1bd8dbb904fd2bc9ebcd538b0f2ea012a45963cc..be3e5ac23e14fad553cde7000c27c007acb3f0f2 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -86,6 +86,7 @@ static int  type_unification_real PROTO((tree, tree *, tree, tree,
 static void note_template_header PROTO((int));
 static tree maybe_fold_nontype_arg PROTO((tree));
 static tree convert_nontype_argument PROTO((tree, tree));
+static tree get_bindings_overload PROTO((tree, tree, tree));
 
 /* Do any processing required when DECL (a member template declaration
    using TEMPLATE_PARAMETERS as its innermost parameter list) is
@@ -5608,13 +5609,13 @@ more_specialized (pat1, pat2, explicit_args)
   tree targs;
   int winner = 0;
 
-  targs = get_bindings (pat1, pat2, explicit_args);
+  targs = get_bindings_overload (pat1, pat2, explicit_args);
   if (targs)
     {
       --winner;
     }
 
-  targs = get_bindings (pat2, pat1, explicit_args);
+  targs = get_bindings_overload (pat2, pat1, explicit_args);
   if (targs)
     {
       ++winner;
@@ -5653,11 +5654,13 @@ more_specialized_class (pat1, pat2)
 
 /* Return the template arguments that will produce the function signature
    DECL from the function template FN, with the explicit template
-   arguments EXPLICIT_ARGS.  */
+   arguments EXPLICIT_ARGS.  If CHECK_RETTYPE is 1, the return type must
+   also match.  */
 
-tree 
-get_bindings (fn, decl, explicit_args)
+static tree
+get_bindings_real (fn, decl, explicit_args, check_rettype)
      tree fn, decl, explicit_args;
+     int check_rettype;
 {
   int ntparms = DECL_NTPARMS (fn);
   tree targs = make_scratch_vec (ntparms);
@@ -5691,18 +5694,37 @@ get_bindings (fn, decl, explicit_args)
 			   1,
 			   extra_fn_arg);
 
-  if (i == 0)
+  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, NULL_TREE);
 
       if (!comptypes (t, TREE_TYPE (TREE_TYPE (decl)), 1))
 	return NULL_TREE;
-
-      return targs;
     }
 
-  return NULL_TREE;
+  return targs;
+}
+
+/* For most uses, we want to check the return type.  */
+
+tree 
+get_bindings (fn, decl, explicit_args)
+     tree fn, decl, explicit_args;
+{
+  return get_bindings_real (fn, decl, explicit_args, 1);
+}
+
+/* But for more_specialized, we only care about the parameter types.  */
+
+static tree
+get_bindings_overload (fn, decl, explicit_args)
+     tree fn, decl, explicit_args;
+{
+  return get_bindings_real (fn, decl, explicit_args, 0);
 }
 
 static tree