aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-valprint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/ada-valprint.c')
-rw-r--r--gdb/ada-valprint.c34
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;