(Ada) Fix print of array using non-contiguous enumeration indexes
authorXavier Roirand <roirand@adacore.com>
Mon, 8 Jan 2018 04:56:36 +0000 (23:56 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 8 Jan 2018 04:56:36 +0000 (23:56 -0500)
commit04bafb1ed002df1f25ca5a5773d87723a4baf46b
tree219c480a5fdbd864dbf046cdd8ad9a1963e3447b
parente09efd5931daf7eede1f4da46313a1aaadd4dbfa
(Ada) Fix print of array using non-contiguous enumeration indexes

Consider the following code:

  type Index is (Index1, Index2);
  Size : constant Integer := 10;
  for Index use (Index1 => 1, Index2 => Size);
  type Array_Index_Enum is array (Index) of Integer;
  my_table : Array_Index_Enum :=(others => 42);

When compiling the code above with a compiler where the GNAT encodings
are turned off (which can be temporarily emulated by using the compiler
switch -fgnat-encodings=minimal), printing this table in gdb leads to:

  (gdb) p my_table
  $1 = (42, 42, 4203344, 10, -8320, 32767, 4203465, 0, 0, 0)

The displayed content is wrong since the handling part believes
that the length of the array is max index value (10) minus the
first index value (1) i+ 1 = 10 which is wrong since index are not
contiguous in this case.

The right behavior is to detect that the array is using enumeration
index hence parse the enumeration values in order to get the number
of indexes in this array (2 indexes here).

This patch fixes this issue and changes the output as follow:

  (gdb) p my_table
  $1 = (42, 42)

gdb/ChangeLog:

        * ada-valprint.c (val_print_packed_array_elements): Use
        proper number of elements when printing an array indexed
        by an enumeration type.

gdb/testsuite/ChangeLog (Joel Brobecker  <brobecker@adacore.com>):

        * gdb.ada/arr_enum_idx_w_gap.exp
        * gdb.ada/arr_enum_idx_w_gap/foo_q418_043.adb

Tested on x86_64-linux.
gdb/ChangeLog
gdb/ada-valprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/arr_enum_idx_w_gap.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/arr_enum_idx_w_gap/foo_q418_043.adb [new file with mode: 0644]