aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/ada-lang.c7
-rw-r--r--gdb/eval.c11
-rw-r--r--gdb/valops.c9
4 files changed, 25 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4249f7f..aedacce 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2008-09-11 Ulrich Weigand <uweigand@de.ibm.com>
+ * valops.c (value_ind): No longer allow dereferencing an
+ integer type.
+ * eval.c (evaluate_subexp_standard): Handle deferencing an
+ integer type here.
+ * ada-lang.c (ada_evaluate_subexp): Likewise.
+
+2008-09-11 Ulrich Weigand <uweigand@de.ibm.com>
+
* ada-valprint.c (ada_val_print_1): When implicitly dereferencing
a reference type, pass the reference type directly to unpack_pointer.
* c-valprint.c (c_val_print): Likewise.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 15310ef..75a9828 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -9155,7 +9155,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
}
else if (TYPE_CODE (type) == TYPE_CODE_INT)
/* GDB allows dereferencing an int. */
- return value_zero (builtin_type_int, lval_memory);
+ return value_zero (builtin_type (exp->gdbarch)->builtin_int,
+ lval_memory);
else
error (_("Attempt to take contents of a non-pointer value."));
}
@@ -9165,6 +9166,10 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
if (ada_is_array_descriptor_type (type))
/* GDB allows dereferencing GNAT array descriptors. */
return ada_coerce_to_simple_array (arg1);
+ else if (TYPE_CODE (type) == TYPE_CODE_INT)
+ /* GDB allows dereferencing an int. */
+ return value_at_lazy (builtin_type (exp->gdbarch)->builtin_int,
+ (CORE_ADDR) value_as_address (arg1));
else
return ada_value_ind (arg1);
diff --git a/gdb/eval.c b/gdb/eval.c
index 6a43e94..f4ae539 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -2288,10 +2288,19 @@ evaluate_subexp_standard (struct type *expect_type,
lval_memory);
else if (TYPE_CODE (type) == TYPE_CODE_INT)
/* GDB allows dereferencing an int. */
- return value_zero (builtin_type_int, lval_memory);
+ return value_zero (builtin_type (exp->gdbarch)->builtin_int,
+ lval_memory);
else
error (_("Attempt to take contents of a non-pointer value."));
}
+
+ /* Allow * on an integer so we can cast it to whatever we want.
+ This returns an int, which seems like the most C-like thing to
+ do. "long long" variables are rare enough that
+ BUILTIN_TYPE_LONGEST would seem to be a mistake. */
+ if (TYPE_CODE (type) == TYPE_CODE_INT)
+ return value_at_lazy (builtin_type (exp->gdbarch)->builtin_int,
+ (CORE_ADDR) value_as_address (arg1));
return value_ind (arg1);
case UNOP_ADDR:
diff --git a/gdb/valops.c b/gdb/valops.c
index 0d1ffdf..f14c2f5 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -1172,14 +1172,7 @@ value_ind (struct value *arg1)
base_type = check_typedef (value_type (arg1));
- /* Allow * on an integer so we can cast it to whatever we want.
- This returns an int, which seems like the most C-like thing to
- do. "long long" variables are rare enough that
- BUILTIN_TYPE_LONGEST would seem to be a mistake. */
- if (TYPE_CODE (base_type) == TYPE_CODE_INT)
- return value_at_lazy (builtin_type_int,
- (CORE_ADDR) value_as_address (arg1));
- else if (TYPE_CODE (base_type) == TYPE_CODE_PTR)
+ if (TYPE_CODE (base_type) == TYPE_CODE_PTR)
{
struct type *enc_type;
/* We may be pointing to something embedded in a larger object.