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