aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2008-10-07 14:07:10 +0000
committerJoel Brobecker <brobecker@gnat.com>2008-10-07 14:07:10 +0000
commit8c1c099fc46e7c80127337c0d81369fe18df33e5 (patch)
treef98cbae89cb92ae3e91cc66e3136e8782167c007 /gdb/ada-lang.c
parentb9eb56c1fd7e43313494e4f50ed4f61351e49b16 (diff)
downloadgdb-8c1c099fc46e7c80127337c0d81369fe18df33e5.zip
gdb-8c1c099fc46e7c80127337c0d81369fe18df33e5.tar.gz
gdb-8c1c099fc46e7c80127337c0d81369fe18df33e5.tar.bz2
* ada-lang.c (ada_evaluate_subexp) [OP_ATR_SIZE]: Add handling
of arguments that are references.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 49fb252..1575fdd 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -9056,14 +9056,21 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
case OP_ATR_SIZE:
arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
+ type = value_type (arg1);
+
+ /* If the argument is a reference, then dereference its type, since
+ the user is really asking for the size of the actual object,
+ not the size of the pointer. */
+ if (TYPE_CODE (type) == TYPE_CODE_REF)
+ type = TYPE_TARGET_TYPE (type);
+
if (noside == EVAL_SKIP)
goto nosideret;
else if (noside == EVAL_AVOID_SIDE_EFFECTS)
return value_zero (builtin_type_int32, not_lval);
else
return value_from_longest (builtin_type_int32,
- TARGET_CHAR_BIT
- * TYPE_LENGTH (value_type (arg1)));
+ TARGET_CHAR_BIT * TYPE_LENGTH (type));
case OP_ATR_VAL:
evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);