diff --git a/gdb/ChangeLog b/gdb/ChangeLog index be192e798a..e512251d49 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2016-04-26 Bernhard Heckel + + * valarith.c (value_address): Resolve dynamic types. + 2016-04-26 Bernhard Heckel Keven Boell diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bb5258283c..7a8f9223c8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-04-26 Bernhard Heckel + + * 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 * gdb.fortran/vla-type.f90: New file. diff --git a/gdb/testsuite/gdb.fortran/vla-type.exp b/gdb/testsuite/gdb.fortran/vla-type.exp index 24191fe082..011e27ea15 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 = " +gdb_test "next" "" +gdb_test "ptype fivedynarr(2)" \ + [multi_line "type = Type five" \ + "\\s+Type one" \ + "\\s+$int :: ivla\\\(\\\)" \ + "\\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 a1066177e3..547312424e 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 7959f3b221..254d99838a 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