aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/ada-lang.c17
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp104
4 files changed, 125 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 82e3622..67f631d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2014-09-10 Joel Brobecker <brobecker@adacore.com>
+ * ada-lang.c (ada_value_ptr_subscript): Remove parameter "type".
+ Adjust function implementation and documentation accordingly.
+ (ada_evaluate_subexp) <OP_FUNCALL>: Only assign "type" if
+ NOSIDE is EVAL_AVOID_SIDE_EFFECTS.
+ Update call to ada_value_ptr_subscript.
+
+2014-09-10 Joel Brobecker <brobecker@adacore.com>
+
* ada-valprint.c (ada_value_print): Use VAL's enclosing type
instead of VAL's type.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 28999c7..4c6d039 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -2715,15 +2715,16 @@ ada_value_subscript (struct value *arr, int arity, struct value **ind)
return elt;
}
-/* Assuming ARR is a pointer to a standard GDB array of type TYPE, the
- value of the element of *ARR at the ARITY indices given in
- IND. Does not read the entire array into memory. */
+/* Assuming ARR is a pointer to a GDB array, the value of the element
+ of *ARR at the ARITY indices given in IND.
+ Does not read the entire array into memory. */
static struct value *
-ada_value_ptr_subscript (struct value *arr, struct type *type, int arity,
- struct value **ind)
+ada_value_ptr_subscript (struct value *arr, int arity, struct value **ind)
{
int k;
+ struct type *type
+ = check_typedef (value_enclosing_type (ada_value_ind (arr)));
for (k = 0; k < arity; k += 1)
{
@@ -10323,9 +10324,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
(ada_coerce_to_simple_array (argvec[0]),
nargs, argvec + 1));
case TYPE_CODE_PTR: /* Pointer to array */
- type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1);
if (noside == EVAL_AVOID_SIDE_EFFECTS)
{
+ type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1);
type = ada_array_element_type (type, nargs);
if (type == NULL)
error (_("element type of array unknown"));
@@ -10333,8 +10334,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
return value_zero (ada_aligned_type (type), lval_memory);
}
return
- unwrap_value (ada_value_ptr_subscript (argvec[0], type,
- nargs, argvec + 1));
+ unwrap_value (ada_value_ptr_subscript (argvec[0],
+ nargs, argvec + 1));
default:
error (_("Attempt to index or call something other than an "
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index e7bba77..ebb7e6a 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2014-09-10 Joel Brobecker <brobecker@adacore.com>
+ * gdb.dwarf2/dynarr-ptr.exp: Add subscripting tests.
+
+2014-09-10 Joel Brobecker <brobecker@adacore.com>
+
* gdb.dwarf2/dynarr-ptr.c: New file.
* gdb.dwarf2/dynarr-ptr.exp: New file.
diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
index 501f129..1df5e3c 100644
--- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
+++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
@@ -137,17 +137,121 @@ gdb_test_no_output "set language ada"
gdb_test "print foo.three_ptr.all" \
" = \\(1, 2, 3\\)"
+gdb_test "print foo.three_ptr.all(1)" \
+ " = 1"
+
+gdb_test "print foo.three_ptr.all(2)" \
+ " = 2"
+
+gdb_test "print foo.three_ptr.all(3)" \
+ " = 3"
+
+# foo.three_ptr
+
+gdb_test "print foo.three_ptr(1)" \
+ " = 1"
+
+gdb_test "print foo.three_ptr(2)" \
+ " = 2"
+
+gdb_test "print foo.three_ptr(3)" \
+ " = 3"
+
# foo.three_ptr_tdef.all
gdb_test "print foo.three_ptr_tdef.all" \
" = \\(1, 2, 3\\)"
+gdb_test "print foo.three_ptr_tdef.all(1)" \
+ " = 1"
+
+gdb_test "print foo.three_ptr_tdef.all(2)" \
+ " = 2"
+
+gdb_test "print foo.three_ptr_tdef.all(3)" \
+ " = 3"
+
+# foo.three_ptr_tdef
+
+gdb_test "print foo.three_ptr_tdef(1)" \
+ " = 1"
+
+gdb_test "print foo.three_ptr_tdef(2)" \
+ " = 2"
+
+gdb_test "print foo.three_ptr_tdef(3)" \
+ " = 3"
+
# foo.five_ptr.all
gdb_test "print foo.five_ptr.all" \
" = \\(2 => 5, 8, 13, 21, 34\\)"
+gdb_test "print foo.five_ptr.all(2)" \
+ " = 5"
+
+gdb_test "print foo.five_ptr.all(3)" \
+ " = 8"
+
+gdb_test "print foo.five_ptr.all(4)" \
+ " = 13"
+
+gdb_test "print foo.five_ptr.all(5)" \
+ " = 21"
+
+gdb_test "print foo.five_ptr.all(6)" \
+ " = 34"
+
+# foo.five_ptr
+
+gdb_test "print foo.five_ptr(2)" \
+ " = 5"
+
+gdb_test "print foo.five_ptr(3)" \
+ " = 8"
+
+gdb_test "print foo.five_ptr(4)" \
+ " = 13"
+
+gdb_test "print foo.five_ptr(5)" \
+ " = 21"
+
+gdb_test "print foo.five_ptr(6)" \
+ " = 34"
+
# foo.five_ptr_tdef.all
gdb_test "print foo.five_ptr_tdef.all" \
" = \\(2 => 5, 8, 13, 21, 34\\)"
+
+gdb_test "print foo.five_ptr_tdef.all(2)" \
+ " = 5"
+
+gdb_test "print foo.five_ptr_tdef.all(3)" \
+ " = 8"
+
+gdb_test "print foo.five_ptr_tdef.all(4)" \
+ " = 13"
+
+gdb_test "print foo.five_ptr_tdef.all(5)" \
+ " = 21"
+
+gdb_test "print foo.five_ptr_tdef.all(6)" \
+ " = 34"
+
+# foo.five_ptr_tdef
+
+gdb_test "print foo.five_ptr_tdef(2)" \
+ " = 5"
+
+gdb_test "print foo.five_ptr_tdef(3)" \
+ " = 8"
+
+gdb_test "print foo.five_ptr_tdef(4)" \
+ " = 13"
+
+gdb_test "print foo.five_ptr_tdef(5)" \
+ " = 21"
+
+gdb_test "print foo.five_ptr_tdef(6)" \
+ " = 34"