[PATCH 4/9] Reject slicing a packed array

Tom Tromey
2020-09-30T20:06:41Z

In Ada mode, gdb rejects slicing a packed array. However, with
-fgnat-encodings=minimal, gdb will instead print incorrect results.
This patch changes gdb to also reject slicing a packed array in this
mode.

FWIW I believe that this rejection is a gdb limitation. Removing it
looked complicated, though, and meanwhile my main goal for the time
being is to bring the DWARF encodings up to par with Gnat encodings.

2020-09-30 Tom Tromey <tromey@adacore.com>

* ada-lang.c (ada_is_any_packed_array_type): New function.
(ada_evaluate_subexp) <case TERNOP_SLICE>: Use it.

gdb/testsuite/ChangeLog
2020-09-30 Tom Tromey <tromey@adacore.com>

* gdb.ada/mod_from_name.exp: Test printing slice.
---
gdb/ChangeLog | 5 +++++
gdb/ada-lang.c | 13 ++++++++++++-
gdb/testsuite/ChangeLog | 4 ++++
gdb/testsuite/gdb.ada/mod_from_name.exp | 1 +
4 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index c7eabbef2ae..d851f57414b 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -2030,6 +2030,17 @@ ada_is_unconstrained_packed_array_type (struct type *type)
return 0;
}

+/* Return true if TYPE is a (Gnat-encoded) constrained packed array
+ type, or if it is an ordinary (non-Gnat-encoded) packed array. */
+
+static bool
+ada_is_any_packed_array_type (struct type *type)
+{
+ return (ada_is_constrained_packed_array_type (type)
+ || (type->code () == TYPE_CODE_ARRAY
+ && TYPE_FIELD_BITSIZE (type, 0) % 8 != 0));
+}
+
/* Given that TYPE encodes a packed array type (constrained or unconstrained),
return the size of its elements in bits. */

@@ -10626,7 +10637,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
TYPE_TARGET_TYPE (value_type (array)) =
ada_aligned_type (TYPE_TARGET_TYPE (value_type (array)));

- if (ada_is_constrained_packed_array_type (value_type (array)))
+ if (ada_is_any_packed_array_type (value_type (array)))
error (_("cannot slice a packed array"));

/* If this is a reference to an array or an array lvalue,
diff --git a/gdb/testsuite/gdb.ada/mod_from_name.exp b/gdb/testsuite/gdb.ada/mod_from_name.exp
index fec383bb490..43d81e0026f 100644
--- a/gdb/testsuite/gdb.ada/mod_from_name.exp
+++ b/gdb/testsuite/gdb.ada/mod_from_name.exp
@@ -40,4 +40,5 @@ foreach_with_prefix scenario {all minimal} {
}
gdb_test "print xp" \
"= \\(y => \\(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10\\)\\)"
+ gdb_test "print slice" "cannot slice a packed array"
}
--
2.26.2