* ada-lang.c (ada_evaluate_subexp) [OP_ATR_SIZE]: Add handling
authorJoel Brobecker <brobecker@gnat.com>
Tue, 7 Oct 2008 14:07:10 +0000 (14:07 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 7 Oct 2008 14:07:10 +0000 (14:07 +0000)
        of arguments that are references.

gdb/ChangeLog
gdb/ada-lang.c

index 572cf7f1cb05bd7e2762a3e86838bfd1c6ec1213..e3534735b04b8ee0c7b0233ae10f0ca1b016582e 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-07  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_evaluate_subexp) [OP_ATR_SIZE]: Add handling
+       of arguments that are references.
+
 2008-10-06  Doug Evans  <dje@google.com>
 
        * dwarf2read.c (dwarf2_die_debug): New static global.
index 49fb252a025337f0f2569865310c19461e47adb9..1575fdd6a8f9c5f215d3f5a77ac63a85bc073916 100644 (file)
@@ -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);