diff options
author | Tom Tromey <tromey@adacore.com> | 2019-03-13 08:40:25 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2019-03-18 06:45:16 -0600 |
commit | bff8c71fd8dece639e69b399883f90b3404a2a48 (patch) | |
tree | 63f669a3e2568e89797dce78b3a2cf55098dcd35 /gdb/ada-lang.c | |
parent | af60449c260235478f9b1f9db39a587fe4c75290 (diff) | |
download | gdb-bff8c71fd8dece639e69b399883f90b3404a2a48.zip gdb-bff8c71fd8dece639e69b399883f90b3404a2a48.tar.gz gdb-bff8c71fd8dece639e69b399883f90b3404a2a48.tar.bz2 |
Fix Ada "ptype" bug with array types
Using ptype on an array type in Ada can sometimes show an incorrect
high bound. This happens because ada_evaluate_subexp will create an
array with an incorrect upper bound in the EVAL_AVOID_SIDE_EFFECTS
case.
This patch fixes the problem by arranging to always create such an
array with valid bounds.
Tested on x86-64 Fedora 29.
gdb/ChangeLog
2019-03-18 Tom Tromey <tromey@adacore.com>
* ada-lang.c (empty_array): Add "high" parameter.
(ada_evaluate_subexp): Update.
gdb/testsuite/ChangeLog
2019-03-18 Joel Brobecker <brobecker@adacore.com>
Tom Tromey <tromey@adacore.com>
* gdb.ada/ptype_array/pck.adb: New file.
* gdb.ada/ptype_array/pck.ads: New file.
* gdb.ada/ptype_array/foo.adb: New file.
* gdb.ada/ptype_array.exp: New file.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index a6fadc8..7153436 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -3173,16 +3173,18 @@ ada_array_length (struct value *arr, int n) return high - low + 1; } -/* An empty array whose type is that of ARR_TYPE (an array type), - with bounds LOW to LOW-1. */ +/* An array whose type is that of ARR_TYPE (an array type), with + bounds LOW to HIGH, but whose contents are unimportant. If HIGH is + less than LOW, then LOW-1 is used. */ static struct value * -empty_array (struct type *arr_type, int low) +empty_array (struct type *arr_type, int low, int high) { struct type *arr_type0 = ada_check_typedef (arr_type); struct type *index_type = create_static_range_type - (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (arr_type0)), low, low - 1); + (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (arr_type0)), low, + high < low ? low - 1 : high); struct type *elt_type = ada_array_element_type (arr_type0, 1); return allocate_value (create_array_type (NULL, elt_type, index_type)); @@ -11033,7 +11035,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (noside == EVAL_AVOID_SIDE_EFFECTS && ada_is_array_descriptor_type (ada_check_typedef (value_type (array)))) - return empty_array (ada_type_of_array (array, 0), low_bound); + return empty_array (ada_type_of_array (array, 0), low_bound, + high_bound); array = ada_coerce_to_simple_array_ptr (array); @@ -11057,7 +11060,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, struct type *type0 = ada_check_typedef (value_type (array)); if (high_bound < low_bound || noside == EVAL_AVOID_SIDE_EFFECTS) - return empty_array (TYPE_TARGET_TYPE (type0), low_bound); + return empty_array (TYPE_TARGET_TYPE (type0), low_bound, high_bound); else { struct type *arr_type0 = @@ -11071,7 +11074,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, else if (noside == EVAL_AVOID_SIDE_EFFECTS) return array; else if (high_bound < low_bound) - return empty_array (value_type (array), low_bound); + return empty_array (value_type (array), low_bound, high_bound); else return ada_value_slice (array, longest_to_int (low_bound), longest_to_int (high_bound)); |