aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/testsuite/ChangeLog7
-rwxr-xr-xgdb/testsuite/gdb.fortran/vla-type.exp52
-rwxr-xr-xgdb/testsuite/gdb.fortran/vla-type.f9020
-rw-r--r--gdb/valarith.c8
5 files changed, 89 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index be192e7..e512251 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,4 +1,8 @@
2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
+
+ * valarith.c (value_address): Resolve dynamic types.
+
+2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
Keven Boell <kevel.boell@intel.com>
* NEWS: Add new supported features for fortran.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index bb52582..7a8f922 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
+ * gdb.fortran/vla-type.f90: Add test for static and dynamic arrays
+ of dynamic types.
+ * gdb.fortran/vla-type.exp: Add test for static and dynamic arrays
+ of dynamic types.
+
+2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
+
* gdb.fortran/vla-type.f90: New file.
* gdb.fortran/vla-type.exp: New file.
diff --git a/gdb/testsuite/gdb.fortran/vla-type.exp b/gdb/testsuite/gdb.fortran/vla-type.exp
index 24191fe..011e27e 100755
--- a/gdb/testsuite/gdb.fortran/vla-type.exp
+++ b/gdb/testsuite/gdb.fortran/vla-type.exp
@@ -100,3 +100,55 @@ gdb_test "ptype fivev" \
"\\s+$int :: ivla\\\(10,10,10\\\)" \
"\\s+End Type one :: tone" \
"End Type five" ]
+
+# Check array of types containing a VLA
+gdb_breakpoint [gdb_get_line_number "fivearr-filled"]
+gdb_continue_to_breakpoint "fivearr-filled"
+gdb_test "print fivearr(1)%tone%ivla(1, 2, 3)" " = 1"
+gdb_test "print fivearr(1)%tone%ivla(2, 2, 10)" "no such vector element"
+gdb_test "print fivearr(1)%tone%ivla(2, 2, 3)" " = 223"
+gdb_test "print fivearr(2)%tone%ivla(12, 14, 16)" " = 2"
+gdb_test "print fivearr(2)%tone%ivla(6, 7, 8)" " = 678"
+gdb_test "ptype fivearr(1)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(2,4,6\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+gdb_test "ptype fivearr(2)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(12,14,16\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+
+# Check allocation status of dynamic array and it's dynamic members
+gdb_test "ptype fivedynarr" "type = <not allocated>"
+gdb_test "next" ""
+gdb_test "ptype fivedynarr(2)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(<not allocated>\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+
+# Check dynamic array of types containing a VLA
+gdb_breakpoint [gdb_get_line_number "fivedynarr-filled"]
+gdb_continue_to_breakpoint "fivedynarr-filled"
+gdb_test "print fivedynarr(1)%tone%ivla(1, 2, 3)" " = 1"
+gdb_test "print fivedynarr(1)%tone%ivla(2, 2, 10)" "no such vector element"
+gdb_test "print fivedynarr(1)%tone%ivla(2, 2, 3)" " = 223"
+gdb_test "print fivedynarr(2)%tone%ivla(12, 14, 16)" " = 2"
+gdb_test "print fivedynarr(2)%tone%ivla(6, 7, 8)" " = 678"
+gdb_test "ptype fivedynarr(1)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(2,4,6\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+gdb_test "ptype fivedynarr(2)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(12,14,16\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
diff --git a/gdb/testsuite/gdb.fortran/vla-type.f90 b/gdb/testsuite/gdb.fortran/vla-type.f90
index a106617..5473124 100755
--- a/gdb/testsuite/gdb.fortran/vla-type.f90
+++ b/gdb/testsuite/gdb.fortran/vla-type.f90
@@ -38,6 +38,8 @@ program vla_struct
type(three) :: threev
type(four) :: fourv
type(five) :: fivev
+ type(five) :: fivearr (2)
+ type(five), allocatable :: fivedynarr (:)
logical :: l
integer :: i, j
@@ -83,6 +85,20 @@ program vla_struct
fivev%tone%ivla(1, 2, 3) = 123
fivev%tone%ivla(3, 2, 1) = 321
- ! dummy statement for bp
- l = allocated(fivev%tone%ivla) ! fivev-filled
+ allocate (fivearr(1)%tone%ivla (2, 4, 6)) ! fivev-filled
+ allocate (fivearr(2)%tone%ivla (12, 14, 16))
+ fivearr(1)%tone%ivla(:, :, :) = 1
+ fivearr(1)%tone%ivla(2, 2, 3) = 223
+ fivearr(2)%tone%ivla(:, :, :) = 2
+ fivearr(2)%tone%ivla(6, 7, 8) = 678
+
+ allocate (fivedynarr(2)) ! fivearr-filled
+ allocate (fivedynarr(1)%tone%ivla (2, 4, 6))
+ allocate (fivedynarr(2)%tone%ivla (12, 14, 16))
+ fivedynarr(1)%tone%ivla(:, :, :) = 1
+ fivedynarr(1)%tone%ivla(2, 2, 3) = 223
+ fivedynarr(2)%tone%ivla(:, :, :) = 2
+ fivedynarr(2)%tone%ivla(6, 7, 8) = 678
+
+ l = allocated(fivedynarr) ! fivedynarr-filled
end program vla_struct
diff --git a/gdb/valarith.c b/gdb/valarith.c
index 7959f3b..254d998 100644
--- a/gdb/valarith.c
+++ b/gdb/valarith.c
@@ -207,6 +207,14 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound)
error (_("no such vector element"));
}
+ if (is_dynamic_type (elt_type))
+ {
+ CORE_ADDR address;
+
+ address = value_address (array) + elt_offs;
+ elt_type = resolve_dynamic_type (elt_type, NULL, address);
+ }
+
if (VALUE_LVAL (array) == lval_memory && value_lazy (array))
v = allocate_value_lazy (elt_type);
else