# Copyright 2015-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 "vla.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 real [fortran_real4]

# Check the ptype of various VLA states and pointer to VLA's.
gdb_breakpoint [gdb_get_line_number "vla1-init"]
gdb_continue_to_breakpoint "vla1-init"
gdb_test "ptype vla1" "type = $real, allocatable \\(:,:,:\\)" "ptype vla1 not initialized"
gdb_test "ptype vla2" "type = $real, allocatable \\(:,:,:\\)" "ptype vla2 not initialized"
gdb_test "ptype pvla" "type = $real \\(:,:,:\\)" "ptype pvla not initialized"
gdb_test "ptype vla1(3, 6, 9)" "no such vector element \\\(vector not allocated\\\)" \
  "ptype vla1(3, 6, 9) not initialized"
gdb_test "ptype vla2(5, 45, 20)" \
  "no such vector element \\\(vector not allocated\\\)" \
  "ptype vla2(5, 45, 20) not initialized"

gdb_breakpoint [gdb_get_line_number "vla1-allocated"]
gdb_continue_to_breakpoint "vla1-allocated"
gdb_test "ptype vla1" "type = $real, allocatable \\\(10,10,10\\\)" \
  "ptype vla1 allocated"

gdb_breakpoint [gdb_get_line_number "vla2-allocated"]
gdb_continue_to_breakpoint "vla2-allocated"
gdb_test "ptype vla2" "type = $real, allocatable \\\(7,42:50,13:35\\\)" \
  "ptype vla2 allocated"

gdb_breakpoint [gdb_get_line_number "vla1-filled"]
gdb_continue_to_breakpoint "vla1-filled"
gdb_test "ptype vla1" "type = $real, allocatable \\\(10,10,10\\\)" \
  "ptype vla1 filled"
gdb_test "ptype vla1(3, 6, 9)" "type = $real"

gdb_breakpoint [gdb_get_line_number "vla2-filled"]
gdb_continue_to_breakpoint "vla2-filled"
gdb_test "ptype vla2" "type = $real, allocatable \\\(7,42:50,13:35\\\)" \
  "ptype vla2 filled"
gdb_test "ptype vla2(5, 45, 20)" "type = $real" \
  "ptype vla2(5, 45, 20) filled"

gdb_breakpoint [gdb_get_line_number "pvla-associated"]
gdb_continue_to_breakpoint "pvla-associated"
gdb_test "ptype pvla" "type = $real \\\(10,10,10\\\)" \
  "ptype pvla associated"
gdb_test "ptype pvla(3, 6, 9)" "type = $real"

gdb_breakpoint [gdb_get_line_number "pvla-re-associated"]
gdb_continue_to_breakpoint "pvla-re-associated"
gdb_test "ptype pvla" "type = $real \\\(7,42:50,13:35\\\)" \
  "ptype pvla re-associated"
gdb_test "ptype vla2(5, 45, 20)" "type = $real" \
  "ptype vla2(5, 45, 20) re-associated"

gdb_breakpoint [gdb_get_line_number "pvla-deassociated"]
gdb_continue_to_breakpoint "pvla-deassociated"
gdb_test "ptype pvla" "type = $real \\(:,:,:\\)" "ptype pvla deassociated"
gdb_test "ptype pvla(5, 45, 20)" \
  "no such vector element \\\(vector not associated\\\)" \
  "ptype pvla(5, 45, 20) not associated"

gdb_breakpoint [gdb_get_line_number "vla1-deallocated"]
gdb_continue_to_breakpoint "vla1-deallocated"
gdb_test "ptype vla1" "type = $real, allocatable \\(:,:,:\\)" "ptype vla1 not allocated"
gdb_test "ptype vla1(3, 6, 9)" "no such vector element \\\(vector not allocated\\\)" \
  "ptype vla1(3, 6, 9) not allocated"

gdb_breakpoint [gdb_get_line_number "vla2-deallocated"]
gdb_continue_to_breakpoint "vla2-deallocated"
gdb_test "ptype vla2" "type = $real, allocatable \\(:,:,:\\)" "ptype vla2 not allocated"
gdb_test "ptype vla2(5, 45, 20)" \
  "no such vector element \\\(vector not allocated\\\)" \
  "ptype vla2(5, 45, 20) not allocated"

gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v1"]
gdb_continue_to_breakpoint "vla1-neg-bounds-v1"
gdb_test "ptype vla1" \
    "type = $real, allocatable \\(-2:-1,-5:-2,-3:-1\\)" \
    "ptype vla1 negative bounds"

gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v2"]
gdb_continue_to_breakpoint "vla1-neg-bounds-v2"
gdb_test "ptype vla1" \
    "type = $real, allocatable \\(-2:1,-5:2,-3:1\\)" \
    "ptype vla1 negative lower bounds, positive upper bounds"
