# Copyright 2016-2021 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

standard_testfile ".f90"
load_lib "fortran.exp"

if {[skip_fortran_tests]} { return -1 }

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
     {debug f90 quiet}] } {
    return -1
}

if ![fortran_runto_main] {
    return -1
}

# Depending on the compiler being used, the type names can be printed differently.
set int [fortran_int4]

# Check if not allocated VLA in type does not break
# the debugger when accessing it.
# break main for Flang compiler already breaks here
if ![test_compiler_info "clang-*"] {
    gdb_breakpoint [gdb_get_line_number "before-allocated"]
    gdb_continue_to_breakpoint "before-allocated"
}

gdb_test "print twov" " = \\\( ivla1 = <not allocated>, ivla2 = <not allocated> \\\)" \
  "print twov before allocated"
gdb_test "print twov%ivla1" " = <not allocated>" \
  "print twov%ivla1 before allocated"

# Check type with one VLA's inside
gdb_breakpoint [gdb_get_line_number "onev-filled"]
gdb_continue_to_breakpoint "onev-filled"
gdb_test "print onev%ivla(5, 11, 23)" " = 1"
gdb_test "print onev%ivla(1, 2, 3)" " = 123"
gdb_test "print onev%ivla(3, 2, 1)" " = 321"
gdb_test "ptype onev" \
         [multi_line "type = Type one" \
                     "\\s+$int, allocatable :: ivla\\\(11,22,33\\\)" \
                     "End Type one" ]

# Check type with two VLA's inside
gdb_breakpoint [gdb_get_line_number "twov-filled"]
gdb_continue_to_breakpoint "twov-filled"
gdb_test "print twov%ivla1(5, 11, 23)" " = 1"
gdb_test "print twov%ivla1(1, 2, 3)" " = 123"
gdb_test "print twov%ivla1(3, 2, 1)" " = 321"
gdb_test "ptype twov" \
         [multi_line "type = Type two" \
                     "\\s+$int, allocatable :: ivla1\\\(5,12,99\\\)" \
                     "\\s+$int, allocatable :: ivla2\\\(9,12\\\)" \
                     "End Type two" ]
gdb_test "print twov" " = \\\( ivla1 = \\\(\\\(\\\(1, 1, 1, 1, 1\\\)\
 \\\(1, 1, 321, 1, 1\\\)\
 \\\(1, 1, 1, 1, 1\\\) .*"

# Check type with attribute at beginn of type
gdb_breakpoint [gdb_get_line_number "threev-filled"]
gdb_continue_to_breakpoint "threev-filled"
gdb_test "print threev%ivla(1)" " = 1"
gdb_test "print threev%ivla(5)" " = 42"
gdb_test "print threev%ivla(14)" " = 24"
gdb_test "print threev%ivar" " = 3"
gdb_test "ptype threev" \
         [multi_line "type = Type three" \
                     "\\s+$int :: ivar" \
                     "\\s+$int, allocatable :: ivla\\\(20\\\)" \
                     "End Type three" ]

# Check type with attribute at end of type
gdb_breakpoint [gdb_get_line_number "fourv-filled"]
gdb_continue_to_breakpoint "fourv-filled"
gdb_test "print fourv%ivla(1)" " = 1"
gdb_test "print fourv%ivla(2)" " = 2"
gdb_test "print fourv%ivla(7)" " = 7"
gdb_test "print fourv%ivla(12)" "no such vector element"
gdb_test "print fourv%ivar" " = 3"
gdb_test "ptype fourv" \
         [multi_line "type = Type four" \
                     "\\s+$int, allocatable :: ivla\\\(10\\\)" \
                     "\\s+$int :: ivar" \
                     "End Type four" ]

# Check nested types containing a VLA
gdb_breakpoint [gdb_get_line_number "fivev-filled"]
gdb_continue_to_breakpoint "fivev-filled"
gdb_test "print fivev%tone%ivla(5, 5, 1)" " = 1"
gdb_test "print fivev%tone%ivla(1, 2, 3)" " = 123"
gdb_test "print fivev%tone%ivla(3, 2, 1)" " = 321"
gdb_test "ptype fivev" \
         [multi_line "type = Type five" \
                     "\\s+Type one :: tone" \
                     "End Type five" ]
gdb_test "ptype fivev%tone" \
         [multi_line "type = Type one" \
                     "    $int, allocatable :: ivla\\(10,10,10\\)" \
                     "End Type one" ]

# 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 :: tone" \
                     "End Type five" ]
gdb_test "ptype fivearr(1)%tone" \
         [multi_line "type = Type one" \
                     "    $int, allocatable :: ivla\\(2,4,6\\)" \
                     "End Type one" ]
gdb_test "ptype fivearr(2)" \
         [multi_line "type = Type five" \
                     "\\s+Type one :: tone" \
                     "End Type five" ]
gdb_test "ptype fivearr(2)%tone" \
         [multi_line "type = Type one" \
                     "    $int, allocatable :: ivla\\(12,14,16\\)" \
                     "End Type one" ]

# Check allocation status of dynamic array and it's dynamic members
gdb_test "ptype fivedynarr" \
         [multi_line "type = Type five" \
                     "    Type one :: tone" \
                     "End Type five, allocatable \\(:\\)" ]
gdb_test "next" ""
gdb_test "ptype fivedynarr(2)" \
         [multi_line "type = Type five" \
                     "\\s+Type one :: tone" \
                     "End Type five" ] \
         "ptype fivedynarr(2), tone is not allocated"
gdb_test "ptype fivedynarr(2)%tone" \
         [multi_line "type = Type one" \
                     "    $int, allocatable :: ivla\\(:,:,:\\)" \
                     "End Type one" ] \
         "ptype fivedynarr(2)%tone, not allocated"

# 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 :: tone" \
                     "End Type five" ]
gdb_test "ptype fivedynarr(1)%tone" \
         [multi_line "type = Type one" \
                     "    $int, allocatable :: ivla\\(2,4,6\\)" \
                     "End Type one" ]
gdb_test "ptype fivedynarr(2)" \
         [multi_line "type = Type five" \
                     "\\s+Type one :: tone" \
                     "End Type five" ]
gdb_test "ptype fivedynarr(2)%tone" \
         [multi_line "type = Type one" \
                     "    $int, allocatable :: ivla\\(12,14,16\\)" \
                     "End Type one" ]
