aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.base/vla-optimized-out.exp22
-rw-r--r--gdb/valarith.c7
4 files changed, 37 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4d0593f..ebe1747 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-09 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * valarith.c (value_subscripted_rvalue): If an array is not in
+ memory, and we don't know the upper bound, then we can't know that
+ the requested element exists or not.
+
2018-08-08 Simon Marchi <simon.marchi@ericsson.com>
* target.c (str_comma_list_concat_elem): Fix typo in comment.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 975705d..bd3c3bf 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2018-08-09 Andrew Burgess <andrew.burgess@embecosm.com>
+ * gdb.base/vla-optimized-out.exp: Add new test.
+
+2018-08-09 Andrew Burgess <andrew.burgess@embecosm.com>
+
* gdb.base/vla-optimized-out-o3.exp: Delete.
* gdb.base/vla-optimized-out-o3-strict.exp: Delete.
* gdb.base/vla-optimized-out.exp: Extend to cover all of the
diff --git a/gdb/testsuite/gdb.base/vla-optimized-out.exp b/gdb/testsuite/gdb.base/vla-optimized-out.exp
index 298b689..88c6fac 100644
--- a/gdb/testsuite/gdb.base/vla-optimized-out.exp
+++ b/gdb/testsuite/gdb.base/vla-optimized-out.exp
@@ -44,6 +44,28 @@ proc vla_optimized_out {exe_suffix options} {
gdb_test "p sizeof (a)" \
" = $sizeof_result" \
"printed size of optimized out vla"
+
+ # At lower optimisation levels, the upper bound of the array is
+ # still defined, it's just the loctaion that tells GDB the array
+ # is optimised out. In that case, when we access an element that
+ # is within the bounds of the array an answer of '<optimized out>'
+ # is reasonable.
+ #
+ # At higher optimisation levels, the array bounds themselves have
+ # been removed. As such GDB can't be expected to know if the
+ # array contains _any_ elements at all. It seems reasonable in
+ # that case to reply with 'no such vector element'.
+ gdb_test "p a\[0\]" \
+ "(= <optimized out>|no such vector element)" \
+ "print out of range element of vla (0)"
+
+ gdb_test "p a\[6\]" \
+ "no such vector element" \
+ "print out of range element of vla (6)"
+
+ gdb_test "p a\[0xffffffff\]" \
+ "no such vector element" \
+ "print out of range element of vla (0xffffffff)"
}
foreach {test_prefix options} \
diff --git a/gdb/valarith.c b/gdb/valarith.c
index 01ca50d..807cdd5 100644
--- a/gdb/valarith.c
+++ b/gdb/valarith.c
@@ -189,8 +189,11 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound)
ULONGEST elt_size = type_length_units (elt_type);
ULONGEST elt_offs = elt_size * (index - lowerbound);
- if (index < lowerbound || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type)
- && elt_offs >= type_length_units (array_type)))
+ if (index < lowerbound
+ || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type)
+ && elt_offs >= type_length_units (array_type))
+ || (VALUE_LVAL (array) != lval_memory
+ && TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type)))
{
if (type_not_associated (array_type))
error (_("no such vector element (vector not associated)"));