diff options
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rwxr-xr-x | gdb/testsuite/gdb.fortran/vla-type.exp | 52 | ||||
-rwxr-xr-x | gdb/testsuite/gdb.fortran/vla-type.f90 | 20 | ||||
-rw-r--r-- | gdb/valarith.c | 8 |
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 |