gdb: Check for not allocated/associated values during array slicing
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 23 May 2019 18:49:41 +0000 (19:49 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 10 Jun 2019 22:05:58 +0000 (23:05 +0100)
When extracting an array slice we should give up if the array is
not-allocated or not-associated.  For Fortran, at least in gfortran
compiled code, the upper and lower bounds are undefined if the array
is not allocated or not associated, in which case performing checks
against these bounds will result in undefined behaviour.

Better then to throw an error if we try to slice such an array.  This
changes the error message that the user will receive in these
cases (if they got an error message before).  Previously they may have
gotten "slice out of range" now they'll get "array not allocated" or
"array not associated".

gdb/ChangeLog:

* valops.c (value_slice): Check for not allocated or not
associated values.

gdb/testsuite/ChangeLog:

* gdb.fortran/vla-sizeof.exp: Update expected results.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.fortran/vla-sizeof.exp
gdb/valops.c

index 6f6e6baee6013ad985e726e9e0096d90ae3b3577..022ce04d000c3be73a0aae72b27d7f9da5c8e2e6 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-10  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * valops.c (value_slice): Check for not allocated or not
+       associated values.
+
 2019-06-10  Tom de Vries  <tdevries@suse.de>
 
        PR gdb/24618
index 7cc712ba560d54bc8ad9d1d9a01ae44d12272d27..33ae2f4925f677758ffbb848bfdf85606d2126ce 100644 (file)
@@ -1,3 +1,7 @@
+2019-06-10  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gdb.fortran/vla-sizeof.exp: Update expected results.
+
 2019-06-06  Amos Bird  <amosbird@gmail.com>
 
        * gdb.base/annota1.exp (thread_switch): Add test for
index b6fdaebbf5156373c3d331713649a1262fdfd9c0..4fe6938445cb34669602393ea6e861ff6b40b5e9 100644 (file)
@@ -32,7 +32,7 @@ gdb_test "print sizeof(vla1)" " = 0" "print sizeof non-allocated vla1"
 gdb_test "print sizeof(vla1(3,2,1))" \
     "no such vector element \\(vector not allocated\\)" \
     "print sizeof non-allocated indexed vla1"
-gdb_test "print sizeof(vla1(3:4,2,1))" "slice out of range" \
+gdb_test "print sizeof(vla1(3:4,2,1))" "array not allocated" \
     "print sizeof non-allocated sliced vla1"
 
 # Try to access value in allocated VLA
@@ -49,7 +49,7 @@ gdb_test "print sizeof(pvla)" " = 0" "print sizeof non-associated pvla"
 gdb_test "print sizeof(pvla(3,2,1))" \
     "no such vector element \\(vector not associated\\)" \
     "print sizeof non-associated indexed pvla"
-gdb_test "print sizeof(pvla(3:4,2,1))" "slice out of range" \
+gdb_test "print sizeof(pvla(3:4,2,1))" "array not associated" \
     "print sizeof non-associated sliced pvla"
 
 # Try to access values in pointer to VLA and compare them
index fd92a4d165575086d9f00e4c5fa8787c427c3691..cbf2eccde3e46d65ee70ecb06e6fb4ae9f2bc8d8 100644 (file)
@@ -3801,6 +3801,11 @@ value_slice (struct value *array, int lowbound, int length)
       && TYPE_CODE (array_type) != TYPE_CODE_STRING)
     error (_("cannot take slice of non-array"));
 
+  if (type_not_allocated (array_type))
+    error (_("array not allocated"));
+  if (type_not_associated (array_type))
+    error (_("array not associated"));
+
   range_type = TYPE_INDEX_TYPE (array_type);
   if (get_discrete_bounds (range_type, &lowerbound, &upperbound) < 0)
     error (_("slice from bad array or bitstring"));