aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-lang.c3
-rw-r--r--gdb/gdbtypes.c3
-rw-r--r--gdb/testsuite/ChangeLog8
-rw-r--r--gdb/testsuite/gdb.ada/arr_acc_idx_w_gap.exp4
-rw-r--r--gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap.ads6
-rw-r--r--gdb/testsuite/gdb.ada/arr_acc_idx_w_gap/enum_with_gap_main.adb1
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);