diff options
author | Tom Tromey <tromey@adacore.com> | 2020-05-26 14:11:08 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-05-26 14:11:08 -0600 |
commit | 0bc2354b811e913b39c288e74d7166eaa3639309 (patch) | |
tree | e807e4fde40111f355fd7605933120fe13e3d52c /gdb | |
parent | 0db49895f30daea6edcc57e4c5003fd02a747c2b (diff) | |
download | binutils-0bc2354b811e913b39c288e74d7166eaa3639309.zip binutils-0bc2354b811e913b39c288e74d7166eaa3639309.tar.gz binutils-0bc2354b811e913b39c288e74d7166eaa3639309.tar.bz2 |
Fix bugs in 'val and 'pos with range types
In Ada, the 'val and 'pos attributes can be used to map from an
enumeration constant to its position in the enum and vice versa.
These operators did not work properly when the type in question was a
subrange of an enum type with "holes".
gdb/ChangeLog
2020-05-26 Tom Tromey <tromey@adacore.com>
* ada-lang.c (value_val_atr): Handle TYPE_CODE_RANGE.
* gdbtypes.c (discrete_position): Handle TYPE_CODE_RANGE.
gdb/testsuite/ChangeLog
2020-05-26 Tom Tromey <tromey@adacore.com>
* gdb.ada/arr_acc_idx_w_gap.exp: Add enum subrange tests.
* gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads (Enum_Subrange): New
type.
* gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb (V): New
variable.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ada-lang.c | 3 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/arr_acc_idx_w_gap.exp | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb | 1 |
7 files changed, 28 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2e21613..00d36ab 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-05-26 Tom Tromey <tromey@adacore.com> + + * ada-lang.c (value_val_atr): Handle TYPE_CODE_RANGE. + * gdbtypes.c (discrete_position): Handle TYPE_CODE_RANGE. + 2020-05-25 Cristiano De Alti <cristiano_dealti@hotmail.com> PR gdb/13519 diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 7522917..5ffb2d6 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -9148,6 +9148,9 @@ value_val_atr (struct type *type, struct value *arg) if (!integer_type_p (value_type (arg))) error (_("'VAL requires integral argument")); + if (type->code () == TYPE_CODE_RANGE) + type = TYPE_TARGET_TYPE (type); + if (type->code () == TYPE_CODE_ENUM) { long pos = value_as_long (arg); diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 4fe8d9a..2ee6989 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1155,6 +1155,9 @@ get_array_bounds (struct type *type, LONGEST *low_bound, LONGEST *high_bound) int discrete_position (struct type *type, LONGEST val, LONGEST *pos) { + if (type->code () == TYPE_CODE_RANGE) + type = TYPE_TARGET_TYPE (type); + if (type->code () == TYPE_CODE_ENUM) { int i; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 50473fc..0cc377f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-05-26 Tom Tromey <tromey@adacore.com> + + * gdb.ada/arr_acc_idx_w_gap.exp: Add enum subrange tests. + * gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads (Enum_Subrange): New + type. + * gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb (V): New + variable. + 2020-05-26 Christian Biesinger <cbiesinger@google.com> * Makefile.in: Use = instead of == for the test command diff --git a/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap.exp b/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap.exp index fd7ac44..c08070e 100644 --- a/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap.exp +++ b/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap.exp @@ -53,3 +53,7 @@ gdb_test "print indexed_by_enum(lit2..lit4)" \ " = \\(lit2 => 43, 42, 41\\)" gdb_test "print s(2..4)" \ " = \"ell\"" + +gdb_test "print v" " = lit3" +gdb_test "print enum_subrange'pos(v)" " = 3" +gdb_test "print enum_subrange'val(3)" " = lit3" diff --git a/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads b/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads index 6e073e8..7193800 100644 --- a/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads +++ b/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads @@ -34,14 +34,16 @@ package Enum_With_Gap is ); for Enum_With_Gaps'size use 16; + type Enum_Subrange is new Enum_With_Gaps range Lit1 .. Lit3; + type MyWord is range 0 .. 16#FFFF# ; for MyWord'Size use 16; type AR is array (Enum_With_Gaps range <>) of MyWord; type AR_Access is access AR; - + type String_Access is access String; - + procedure Do_Nothing (E : AR_Access); procedure Do_Nothing (E : String_Access); diff --git a/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb b/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb index da37dd7..752b883 100644 --- a/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb +++ b/gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb @@ -19,6 +19,7 @@ procedure Enum_With_Gap_Main is Indexed_By_Enum : AR_Access := new AR'(LIT1 => 1, LIT2 => 43, LIT3 => 42, LIT4 => 41); S : String_Access := new String'("Hello!"); + V : Enum_Subrange := LIT3; begin Do_Nothing (Indexed_By_Enum); -- BREAK Do_Nothing (S); |