diff options
author | Kung Hsu <kung@cygnus> | 1993-11-17 18:07:58 +0000 |
---|---|---|
committer | Kung Hsu <kung@cygnus> | 1993-11-17 18:07:58 +0000 |
commit | 406202580838d02393e3b077effdb6dfcaee94ee (patch) | |
tree | 16fc02e3df7f28575e3a20b0d0470999ef8de0fd /gdb/valops.c | |
parent | 38ee1de0949da9e6756b68626d26d9f508c6a388 (diff) | |
download | gdb-406202580838d02393e3b077effdb6dfcaee94ee.zip gdb-406202580838d02393e3b077effdb6dfcaee94ee.tar.gz gdb-406202580838d02393e3b077effdb6dfcaee94ee.tar.bz2 |
Modified Files:
ChangeLog eval.c valops.c
* valops.c (typecmp): improve prototype matching when calling
a method. Make 'p (*(ostream *) &cout) << "lll" ' to work.
* eval.c(evalute_subexp): fix operator search problem when call
like p x.'operator+'(i).
Diffstat (limited to 'gdb/valops.c')
-rw-r--r-- | gdb/valops.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/gdb/valops.c b/gdb/valops.c index ebddb5b..52f3bc4 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1278,21 +1278,27 @@ typecmp (staticp, t1, t2) if (t1[!staticp] == 0) return 0; for (i = !staticp; t1[i] && TYPE_CODE (t1[i]) != TYPE_CODE_VOID; i++) { + struct type *tt1, *tt2; if (! t2[i]) return i+1; - if (TYPE_CODE (t1[i]) == TYPE_CODE_REF + tt1 = t1[i]; + tt2 = VALUE_TYPE(t2[i]); + if (TYPE_CODE (tt1) == TYPE_CODE_REF /* We should be doing hairy argument matching, as below. */ - && (TYPE_CODE (TYPE_TARGET_TYPE (t1[i])) - == TYPE_CODE (VALUE_TYPE (t2[i])))) + && (TYPE_CODE (TYPE_TARGET_TYPE (tt1)) == TYPE_CODE (tt2))) { t2[i] = value_addr (t2[i]); continue; } - if (TYPE_CODE (t1[i]) == TYPE_CODE_PTR - && TYPE_CODE (VALUE_TYPE (t2[i])) == TYPE_CODE_ARRAY) - /* Array to pointer is a `trivial conversion' according to the ARM. */ - continue; + while (TYPE_CODE (tt1) == TYPE_CODE_PTR + && (TYPE_CODE(tt2)==TYPE_CODE_ARRAY || TYPE_CODE(tt2)==TYPE_CODE_PTR)) + { + tt1 = TYPE_TARGET_TYPE(tt1); + tt2 = TYPE_TARGET_TYPE(tt2); + } + if (TYPE_CODE(tt1) == TYPE_CODE(tt2)) continue; + /* Array to pointer is a `trivial conversion' according to the ARM. */ /* We should be doing much hairier argument matching (see section 13.2 of the ARM), but as a quick kludge, just check for the same type @@ -1400,6 +1406,7 @@ search_struct_method (name, arg1p, args, offset, static_memfuncp, type) register struct type *type; { int i; + value v; static int name_matched = 0; check_stub_type (type); @@ -1425,7 +1432,8 @@ search_struct_method (name, arg1p, args, offset, static_memfuncp, type) return (value)value_virtual_fn_field (arg1p, f, j, type, offset); if (TYPE_FN_FIELD_STATIC_P (f, j) && static_memfuncp) *static_memfuncp = 1; - return (value)value_fn_field (arg1p, f, j, type, offset); + v = (value)value_fn_field (arg1p, f, j, type, offset); + if (v != (value)NULL) return v; } j--; } @@ -1434,7 +1442,6 @@ search_struct_method (name, arg1p, args, offset, static_memfuncp, type) for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--) { - value v; int base_offset; if (BASETYPE_VIA_VIRTUAL (type, i)) @@ -1547,9 +1554,10 @@ value_struct_elt (argp, args, name, static_memfuncp, err) if (!args[1]) { /* destructors are a special case. */ - return (value)value_fn_field (NULL, TYPE_FN_FIELDLIST1 (t, 0), - TYPE_FN_FIELDLIST_LENGTH (t, 0), - 0, 0); + v = (value)value_fn_field (NULL, TYPE_FN_FIELDLIST1 (t, 0), + TYPE_FN_FIELDLIST_LENGTH (t, 0), 0, 0); + if (!v) error("could not find destructor function named %s.", name); + else return v; } else { |