variables whose type is a typedef to an array pointer
authorJoel Brobecker <brobecker@gnat.com>
Fri, 1 Jul 2011 18:25:49 +0000 (18:25 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 1 Jul 2011 18:25:49 +0000 (18:25 +0000)
If we declare a type as being an access to array type, and then
declare a variable of that type, for instance:

        type Some_Array is array [...];
        type Array_Access is access all Some_Array;
        Table : Array_Access := [...];

The variable "Table" may be defined in the debugging information
as being a typedef to the array pointer type. In the past, it was
defined directly as the array pointer type, but this has been changed
to make sure that the typedef type gets used.

If the typedef type wasn't used, it would allow the compiler to stop
emitting that typedef type when compiling with
-feliminate-unused-debug-types.  The removal of this typedef would
be a problem, because GDB relies on the typedef to create symbols
for pointer types, and without it, we would no longer be able to
do "ptype array_access".

This patch helps prevent incorrect output or even crashes when that
extra typedef layer is used.

The testing is already mostly covered by arrayptr.exp, but I still
added a 'ptype' test, just for good measure.

gdb/ChangeLog: (Eric Botcazou)

        * ada-lang.c (thin_descriptor_type): Deal with typedefs.
        (decode_constrained_packed_array): Likewise.
        (ada_evaluate_subexp) <TERNOP_SLICE>: Likewise.

gdb/testsuite/ChangeLog (Joel Brobecker):

        * gdb.ada/arrayptr.exp: Add ptype test.

gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/arrayptr.exp

index 87832cfee3a3adc243b32fe07f96e201296f2eeb..699b40caf1cda0d72d340514e1bbb0c54eda8894 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * ada-lang.c (thin_descriptor_type): Deal with typedefs.
+       (decode_constrained_packed_array): Likewise.
+       (ada_evaluate_subexp) <TERNOP_SLICE>: Likewise.
+
 2011-07-01  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-exp.y (convert_char_literal): Handle typedef types.
index 4f6e1611e56997d42fb554c1c63a07766dca5cd7..3e30c9ed97509af47dc55167f1c84222a37302ba 100644 (file)
@@ -1443,7 +1443,7 @@ thin_descriptor_type (struct type *type)
 static struct value *
 thin_data_pntr (struct value *val)
 {
-  struct type *type = value_type (val);
+  struct type *type = ada_check_typedef (value_type (val));
   struct type *data_type = desc_data_target_type (thin_descriptor_type (type));
 
   data_type = lookup_pointer_type (data_type);
@@ -2093,7 +2093,7 @@ decode_constrained_packed_array (struct value *arr)
      of the routine assumes that the array hasn't been decoded yet,
      so we use the basic "value_ind" routine to perform the dereferencing,
      as opposed to using "ada_value_ind".  */
-  if (TYPE_CODE (value_type (arr)) == TYPE_CODE_PTR)
+  if (TYPE_CODE (ada_check_typedef (value_type (arr))) == TYPE_CODE_PTR)
     arr = value_ind (arr);
 
   type = decode_constrained_packed_array_type (value_type (arr));
@@ -9522,16 +9522,17 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
         if (!ada_is_simple_array_type (value_type (array)))
           error (_("cannot take slice of non-array"));
 
-        if (TYPE_CODE (value_type (array)) == TYPE_CODE_PTR)
+        if (TYPE_CODE (ada_check_typedef (value_type (array)))
+            == TYPE_CODE_PTR)
           {
+            struct type *type0 = ada_check_typedef (value_type (array));
+
             if (high_bound < low_bound || noside == EVAL_AVOID_SIDE_EFFECTS)
-              return empty_array (TYPE_TARGET_TYPE (value_type (array)),
-                                  low_bound);
+              return empty_array (TYPE_TARGET_TYPE (type0), low_bound);
             else
               {
                 struct type *arr_type0 =
-                  to_fixed_array_type (TYPE_TARGET_TYPE (value_type (array)),
-                                       NULL, 1);
+                  to_fixed_array_type (TYPE_TARGET_TYPE (type0), NULL, 1);
 
                 return ada_value_slice_from_ptr (array, arr_type0,
                                                  longest_to_int (low_bound),
index a27a8bd18ee93e22c54d7073de6c3b21cb5dd2e4..1dc763d6eeca10be352867483fcff0214c6705e7 100644 (file)
@@ -1,3 +1,7 @@
+2011-07-01  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.ada/arrayptr.exp: Add ptype test.
+
 2011-07-01  Joel Brobecker  <brobecker@adacore.com>
 
        * gdb.ada/char_enum: New testcase.
index ba30d612db65f85e6d4267192555c122193962ee..9b06bc1ba32aea4da6a3cb97a1defacad7ca14bd 100644 (file)
@@ -51,3 +51,5 @@ gdb_test "print arr_ptr (2)" "= 22"
 
 gdb_test "print arr_ptr (3..4)" "= \\(3 => 23, 24\\)"
 
+gdb_test "ptype string_access" "= access array \\(<>\\) of character"
+