From c9a28cbed612a32efca1167d3b4641278a85059e Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 4 Nov 2020 08:49:16 -0700 Subject: [PATCH] Reject slicing a packed array 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. gdb/ChangeLog 2020-11-04 Tom Tromey * ada-lang.c (ada_is_any_packed_array_type): New function. (ada_evaluate_subexp) : Use it. gdb/testsuite/ChangeLog 2020-11-04 Tom Tromey * 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/ChangeLog b/gdb/ChangeLog index 031792d50b5..1b473d55867 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-11-04 Tom Tromey + + * ada-lang.c (ada_is_any_packed_array_type): New function. + (ada_evaluate_subexp) : Use it. + 2020-11-04 Tom Tromey * dwarf2/read.c (recognize_bound_expression) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index f6043b50aff..bfb46a538b9 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2012,6 +2012,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. */ @@ -10609,7 +10620,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/ChangeLog b/gdb/testsuite/ChangeLog index 5190920812f..386b58e8020 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-11-04 Tom Tromey + + * gdb.ada/mod_from_name.exp: Test printing slice. + 2020-11-04 Tom Tromey * gdb.ada/O2_float_param.exp: Test different -fgnat-encodings 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.30.2