gdb/gdbtypes: fix handling of typedef layers between array types
authorPierre-Marie de Rodat <derodat@adacore.com>
Wed, 22 Jul 2015 10:25:14 +0000 (12:25 +0200)
committerPierre-Marie de Rodat <derodat@adacore.com>
Thu, 23 Jul 2015 12:59:58 +0000 (14:59 +0200)
commitd0d8478068ae7c01b1a504ca2fba90c1d36c5566
tree92bab97097a7c33fcb6bc30c574405962787ef88
parentc2fbdc5901a9220d0953f14c27760c3d3ae13074
gdb/gdbtypes: fix handling of typedef layers between array types

When a dynamic array type contains a typedef-wrapped array, an assertion
failure occurs during type resolution.  This is what happens in the
following Ada case:

    type Rec_Type is record
       I : Integer;
       B : Boolean;
    end record;

    type Vec_Type is array (1 .. 4) of Rec_Type;

    type Array_Type is array (Positive range <>) of Vec_Type;

If users try to print or even pass to an inferior call a variable A of
type Array_Type, GDB will raise an error:

    (gdb) print a
    ../../src/gdb/gdbtypes.c:1807: internal-error:
    resolve_dynamic_array: Assertion `TYPE_CODE (type) ==
    TYPE_CODE_ARRAY' failed.
    A problem internal to GDB has been detected,
    further debugging may prove unreliable.
    Quit this debugging session? (y or n)

What happens is that during dynamic array type resolution, we first peel
TYPE_CODE_TYPEDEF layers wrapping the array element type and check if
its type is itself TYPE_CODE_ARRAY.  If it is, we pass the
typedef-wrapped type to a recursive call to resolve_dynamic_array
whereas this function expects only TYPE_CODE_ARRAY types.

This patch makes it pass the peeled type to the recursive call so that
type resolution can continue smoothly.

gdb/ChangeLog:

* gdbtypes.c (resolve_dynamic_array): Pass the peeled element
type to the recursive call instead of the original (maybe
TYPE_CODE_TYPEDEF) type.

gdb/testsuite/ChangeLog:

* gdb.ada/var_arr_typedef.exp: New testcase.
* gdb.ada/var_arr_typedef/pack.adb: New file.
* gdb.ada/var_arr_typedef/pack.ads: New file.
* gdb.ada/var_arr_typedef/var_arr_typedef.adb: New file.
gdb/ChangeLog
gdb/gdbtypes.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/var_arr_typedef.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/var_arr_typedef/pack.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/var_arr_typedef/pack.ads [new file with mode: 0644]
gdb/testsuite/gdb.ada/var_arr_typedef/var_arr_typedef.adb [new file with mode: 0644]