aboutsummaryrefslogtreecommitdiff
path: root/gdb/valops.c
diff options
context:
space:
mode:
authorJohn Gilmore <gnu@cygnus>1991-12-05 11:56:20 +0000
committerJohn Gilmore <gnu@cygnus>1991-12-05 11:56:20 +0000
commit2a5ec41d888f9f6004f237670e676ea5617f281e (patch)
tree50ebecce00b9c431f91c988785bf39faa2753bc9 /gdb/valops.c
parent98618bf78adc8b432655d41f088e66556538e5df (diff)
downloadgdb-2a5ec41d888f9f6004f237670e676ea5617f281e.zip
gdb-2a5ec41d888f9f6004f237670e676ea5617f281e.tar.gz
gdb-2a5ec41d888f9f6004f237670e676ea5617f281e.tar.bz2
Fix things pointed up by Fred Fish's test suite; see ChangeLog.
Diffstat (limited to 'gdb/valops.c')
-rw-r--r--gdb/valops.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/gdb/valops.c b/gdb/valops.c
index 45cca2e..0becbf4 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -69,7 +69,7 @@ value_cast (type, arg2)
offset the pointer rather than just change its type. */
struct type *t1 = TYPE_TARGET_TYPE (type);
struct type *t2 = TYPE_TARGET_TYPE (VALUE_TYPE (arg2));
- if (TYPE_CODE (t1) == TYPE_CODE_STRUCT
+ if ( TYPE_CODE (t1) == TYPE_CODE_STRUCT
&& TYPE_CODE (t2) == TYPE_CODE_STRUCT
&& TYPE_NAME (t1) != 0) /* if name unknown, can't have supercl */
{
@@ -565,10 +565,11 @@ value_arg_coerce (arg)
type = VALUE_TYPE (arg);
if (TYPE_CODE (type) == TYPE_CODE_INT
- && TYPE_LENGTH (type) < sizeof (int))
+ && TYPE_LENGTH (type) < TYPE_LENGTH (builtin_type_int))
return value_cast (builtin_type_int, arg);
- if (type == builtin_type_float)
+ if (TYPE_CODE (type) == TYPE_CODE_FLT
+ && TYPE_LENGTH (type) < TYPE_LENGTH (builtin_type_double))
return value_cast (builtin_type_double, arg);
return arg;
@@ -949,7 +950,7 @@ value_string (ptr, len)
/* Helper function used by value_struct_elt to recurse through baseclasses.
Look for a field NAME in ARG1. Adjust the address of ARG1 by OFFSET bytes,
- and treat the result as having type TYPE.
+ and search in it assuming it has (class) type TYPE.
If found, return value, else return NULL.
If LOOKING_FOR_BASECLASS, then instead of looking for struct fields,
@@ -1019,7 +1020,7 @@ search_struct_field (name, arg1, offset, type, looking_for_baseclass)
/* Helper function used by value_struct_elt to recurse through baseclasses.
Look for a field NAME in ARG1. Adjust the address of ARG1 by OFFSET bytes,
- and treat the result as having type TYPE.
+ and search in it assuming it has (class) type TYPE.
If found, return value, else return NULL. */
static value
@@ -1127,7 +1128,7 @@ value_struct_elt (argp, args, name, static_memfuncp, err)
if (TYPE_CODE (t) == TYPE_CODE_MEMBER)
error ("not implemented: member type in value_struct_elt");
- if (TYPE_CODE (t) != TYPE_CODE_STRUCT
+ if ( TYPE_CODE (t) != TYPE_CODE_STRUCT
&& TYPE_CODE (t) != TYPE_CODE_UNION)
error ("Attempt to extract a component of a value that is not a %s.", err);
@@ -1275,7 +1276,7 @@ check_field (arg1, name)
if (TYPE_CODE (t) == TYPE_CODE_MEMBER)
error ("not implemented: member type in check_field");
- if (TYPE_CODE (t) != TYPE_CODE_STRUCT
+ if ( TYPE_CODE (t) != TYPE_CODE_STRUCT
&& TYPE_CODE (t) != TYPE_CODE_UNION)
error ("Internal error: `this' is not an aggregate");
@@ -1283,10 +1284,11 @@ check_field (arg1, name)
}
/* C++: Given an aggregate type DOMAIN, and a member name NAME,
- return the address of this member as a pointer to member
+ return the address of this member as a "pointer to member"
type. If INTYPE is non-null, then it will be the type
of the member we are looking for. This will help us resolve
- pointers to member functions. */
+ "pointers to member functions". This function is only used
+ to resolve user expressions of the form "&class::member". */
value
value_struct_elt_for_address (domain, intype, name)
@@ -1299,7 +1301,7 @@ value_struct_elt_for_address (domain, intype, name)
struct type *baseclass;
- if (TYPE_CODE (t) != TYPE_CODE_STRUCT
+ if ( TYPE_CODE (t) != TYPE_CODE_STRUCT
&& TYPE_CODE (t) != TYPE_CODE_UNION)
error ("Internal error: non-aggregate type to value_struct_elt_for_address");
@@ -1310,6 +1312,7 @@ value_struct_elt_for_address (domain, intype, name)
for (i = TYPE_NFIELDS (t) - 1; i >= TYPE_N_BASECLASSES (t); i--)
{
char *t_field_name = TYPE_FIELD_NAME (t, i);
+
if (t_field_name && !strcmp (t_field_name, name))
{
if (TYPE_FIELD_STATIC (t, i))
@@ -1317,7 +1320,10 @@ value_struct_elt_for_address (domain, intype, name)
char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (t, i);
struct symbol *sym =
lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL);
- if (! sym) error ("Internal error: could not find physical static variable named %s", phys_name);
+ if (! sym)
+ error (
+ "Internal error: could not find physical static variable named %s",
+ phys_name);
return value_from_longest (
lookup_pointer_type (TYPE_FIELD_TYPE (t, i)),
(LONGEST)SYMBOL_BLOCK_VALUE (sym));
@@ -1345,7 +1351,7 @@ value_struct_elt_for_address (domain, intype, name)
/* Destructors are a special case. */
if (destructor_name_p (name, t))
{
- error ("pointers to destructors not implemented yet");
+ error ("member pointers to destructors not implemented yet");
}
/* Perform all necessary dereferencing. */
@@ -1374,7 +1380,8 @@ value_struct_elt_for_address (domain, intype, name)
else
j = 0;
- check_stub_method (t, i, j);
+ if (TYPE_FLAGS (TYPE_FN_FIELD_TYPE (f, j)) & TYPE_FLAG_STUB)
+ check_stub_method (t, i, j);
if (TYPE_FN_FIELD_VIRTUAL_P (f, j))
{
return value_from_longest (
@@ -1388,7 +1395,9 @@ value_struct_elt_for_address (domain, intype, name)
struct symbol *s = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
0, VAR_NAMESPACE, 0, NULL);
v = locate_var_value (s, 0);
- VALUE_TYPE (v) = lookup_pointer_type (lookup_member_type (TYPE_FN_FIELD_TYPE (f, j), baseclass));
+ VALUE_TYPE (v) = lookup_pointer_type (
+ lookup_member_type (TYPE_FN_FIELD_TYPE (f, j),
+ baseclass));
return v;
}
}