From: Joel Brobecker Date: Tue, 7 Oct 2008 14:07:10 +0000 (+0000) Subject: * ada-lang.c (ada_evaluate_subexp) [OP_ATR_SIZE]: Add handling X-Git-Tag: sid-snapshot-20081201~423 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8c1c099fc46e7c80127337c0d81369fe18df33e5;p=thirdparty%2Fbinutils-gdb.git * ada-lang.c (ada_evaluate_subexp) [OP_ATR_SIZE]: Add handling of arguments that are references. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 572cf7f1cb0..e3534735b04 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-10-07 Joel Brobecker + + * ada-lang.c (ada_evaluate_subexp) [OP_ATR_SIZE]: Add handling + of arguments that are references. + 2008-10-06 Doug Evans * dwarf2read.c (dwarf2_die_debug): New static global. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 49fb252a025..1575fdd6a8f 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);