diff options
Diffstat (limited to 'gdb/ada-valprint.c')
-rw-r--r-- | gdb/ada-valprint.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index f5a2c3c..a486919 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -141,11 +141,45 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr, { LONGEST high; + struct type *base_index_type; if (get_discrete_bounds (index_type, &low, &high) < 0) len = 1; else len = high - low + 1; + + if (TYPE_CODE (index_type) == TYPE_CODE_RANGE) + base_index_type = TYPE_TARGET_TYPE (index_type); + else + base_index_type = index_type; + + if (TYPE_CODE (base_index_type) == TYPE_CODE_ENUM) + { + LONGEST low_pos, high_pos; + + /* Non-contiguous enumerations types can by used as index types + so the array length is computed from the positions of the + first and last literal in the enumeration type, and not from + the values of these literals. */ + + if (!discrete_position (base_index_type, low, &low_pos) + || !discrete_position (base_index_type, high, &high_pos)) + { + warning (_("unable to get positions in array, use bounds instead")); + low_pos = low; + high_pos = high; + } + + /* The array length should normally be HIGH_POS - LOW_POS + 1. + But in Ada we allow LOW_POS to be greater than HIGH_POS for + empty arrays. In that situation, the array length is just zero, + not negative! */ + + if (low_pos > high_pos) + len = 0; + else + len = high_pos - low_pos + 1; + } } i = 0; |