Skip to content
  • Joel Brobecker's avatar
    [gdb/Ada] slices of arrays with dynamic strides · 9fe561ab
    Joel Brobecker authored
        Consider the following Ada code:
    
           procedure Nested (L, U : Integer) is
              subtype Small_Type is Integer range L .. U;
              type Record_Type (I : Small_Type := L) is record
                 S : String (1 .. I);
              end record;
              type Array_Type is array (Integer range <>) of Record_Type;
    
              A1 : Array_Type :=
                (1 => (I => 0, S => <>),
                 2 => (I => 1, S => "A"),
                 3 => (I => 2, S => "AB"));
    
              procedure Discard (R : Record_Type) is
              begin
                 null;
              end Discard;
    
           begin
              Discard (A1 (1));  -- STOP
           end;
    
    Trying to print a slice of that array currently yields:
    
        (gdb) p a1(1..3)
        $1 = ((i => 0, s => ""), (i => 0, s => ""), (i => 0, s => ""))
    
    We expected instead:
    
        (gdb) p a1(1..3)
        $1 = ((i => 0, s => ""), (i => 1, s => "A"), (i => 2, s => "AB"))
    
    This is because the functions we use in ada-lang.c to create the type
    of the array slice (ada_value_slice and ada_value_slice_from_ptr) was
    not taking into account the stride of the array. This patch fixes this.
    
    gdb/ChangeLog:
    
            * ada-lang.c (ada_value_slice_from_ptr): Take array stride into
            account when creating the array type of the slice.
            (ada_value_slice): Likewise.
    
    gdb/testsuite/ChangeLog:
    
            * gdb.ada/dyn_stride.exp: Add slice test.
    
    Note that, with the current use of ada_value_slice, the enhancement
    to handle dynamic array strides seems unnecessary, because I do not
    see how an array with a dynamic stride can be referenced by either
    by reference or pointer. Since references are coerced to array pointers,
    in both cases, the slice is performed by ada_value_slice_from_ptr.
    But ada_value_slice is enhanced nonetheless, in the spirit of making
    the code more robust, in case we missed something, and also as similar
    as possible with its from_ptr counterpart.
    
    tested on x86_64-linux.
    9fe561ab
To find the state of this project's repository at the time of any of these versions, check out the tags.