diff options
author | Andrew Cagney <cagney@redhat.com> | 2000-03-13 10:01:23 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2000-03-13 10:01:23 +0000 |
commit | db577aea67972fda821bfdf9143571bb2159c54d (patch) | |
tree | 0ed751caa70476041556a905d72c1bb1901ad7ce /gdb/gdbtypes.c | |
parent | 7b83ea04b2d7d79fbd2914e363ca9eab18bc2f52 (diff) | |
download | gdb-db577aea67972fda821bfdf9143571bb2159c54d.zip gdb-db577aea67972fda821bfdf9143571bb2159c54d.tar.gz gdb-db577aea67972fda821bfdf9143571bb2159c54d.tar.bz2 |
From Daniel Berlin:
Fix C++ overloading, add support for seeing through references.
Diffstat (limited to 'gdb/gdbtypes.c')
-rw-r--r-- | gdb/gdbtypes.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 2016672..d361d15 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -994,7 +994,7 @@ lookup_struct_elt_type (type, name, noerr) { char *t_field_name = TYPE_FIELD_NAME (type, i); - if (t_field_name && STREQ (t_field_name, name)) + if (t_field_name && (strcmp_iw (t_field_name, name) == 0)) { return TYPE_FIELD_TYPE (type, i); } @@ -2136,8 +2136,8 @@ rank_function (parms, nparms, args, nargs) LENGTH_MATCH (bv) = (nargs != nparms) ? LENGTH_MISMATCH_BADNESS : 0; /* Now rank all the parameters of the candidate function */ - for (i = 1; i <= min_len; i++) - bv->rank[i] = rank_one_type (parms[i - 1], args[i - 1]); + for (i = 1; i < min_len; i++) + bv->rank[i] = rank_one_type (parms[i], args[i]); /* If more arguments than parameters, add dummy entries */ for (i = min_len + 1; i <= nargs; i++) @@ -2178,8 +2178,21 @@ rank_one_type (parm, arg) if (parm == arg) return 0; -#if 0 - /* Debugging only */ + /* See through references, since we can almost make non-references + references. */ + if (TYPE_CODE (arg) == TYPE_CODE_REF) + return (rank_one_type (TYPE_TARGET_TYPE (arg), parm) + + REFERENCE_CONVERSION_BADNESS); + if (TYPE_CODE (parm) == TYPE_CODE_REF) + return (rank_one_type (arg, TYPE_TARGET_TYPE (parm)) + + REFERENCE_CONVERSION_BADNESS); + +#ifdef DEBUG_OLOAD + /* Debugging only. */ + /* FIXME/FYI: cagney/2000-03-13: No need to #ifdef this sort of + thing. Instead add a command like ``set debug gdbtypes <int>''. + (A predicate to this is the addition of the ``set debug''). Also, + send the output to gdb_stderr and don't use printf. */ printf ("------ Arg is %s [%d], parm is %s [%d]\n", TYPE_NAME (arg), TYPE_CODE (arg), TYPE_NAME (parm), TYPE_CODE (parm)); #endif @@ -2246,16 +2259,16 @@ rank_one_type (parm, arg) { if (TYPE_UNSIGNED (arg)) { - if (!strcmp (TYPE_NAME (parm), TYPE_NAME (arg))) + if (!strcmp_iw (TYPE_NAME (parm), TYPE_NAME (arg))) return 0; /* unsigned int -> unsigned int, or unsigned long -> unsigned long */ - else if (!strcmp (TYPE_NAME (arg), "int") && !strcmp (TYPE_NAME (parm), "long")) + else if (!strcmp_iw (TYPE_NAME (arg), "int") && !strcmp_iw (TYPE_NAME (parm), "long")) return INTEGER_PROMOTION_BADNESS; /* unsigned int -> unsigned long */ else return INTEGER_COERCION_BADNESS; /* unsigned long -> unsigned int */ } else { - if (!strcmp (TYPE_NAME (arg), "long") && !strcmp (TYPE_NAME (parm), "int")) + if (!strcmp_iw (TYPE_NAME (arg), "long") && !strcmp_iw (TYPE_NAME (parm), "int")) return INTEGER_COERCION_BADNESS; /* signed long -> unsigned int */ else return INTEGER_CONVERSION_BADNESS; /* signed int/long -> unsigned int/long */ @@ -2263,9 +2276,9 @@ rank_one_type (parm, arg) } else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg)) { - if (!strcmp (TYPE_NAME (parm), TYPE_NAME (arg))) + if (!strcmp_iw (TYPE_NAME (parm), TYPE_NAME (arg))) return 0; - else if (!strcmp (TYPE_NAME (arg), "int") && !strcmp (TYPE_NAME (parm), "long")) + else if (!strcmp_iw (TYPE_NAME (arg), "int") && !strcmp_iw (TYPE_NAME (parm), "long")) return INTEGER_PROMOTION_BADNESS; else return INTEGER_COERCION_BADNESS; |