# Copyright 2008-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/>.

# This file was written by Jan Kratochvil <jan.kratochvil@redhat.com>.

if {[skip_fortran_tests]} {
    return 0
}

standard_testfile .f90
load_lib "fortran.exp"

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

if ![fortran_runto_main] then {
    perror "couldn't run to main"
    continue
}

gdb_breakpoint [gdb_get_line_number "stop-here-out"]
gdb_continue_to_breakpoint "stop-here-out"

# Common block naming with source name /foo/:
#                .symtab  DW_TAG_common_block's DW_AT_name
# Intel Fortran  foo_     foo_
# GNU Fortran    foo_     foo
#set suffix "_"
set suffix ""

# Depending on the compiler being used, the type names can be printed differently.
set int4 [fortran_int4]
set real4 [fortran_real4]
set real8 [fortran_real8]

gdb_test "whatis foo$suffix" "No symbol \"foo$suffix\" in current context."
gdb_test "ptype foo$suffix" "No symbol \"foo$suffix\" in current context."
gdb_test "p foo$suffix" "No symbol \"foo$suffix\" in current context."
gdb_test "whatis fo_o$suffix" "No symbol \"fo_o$suffix\" in current context."
gdb_test "ptype fo_o$suffix" "No symbol \"fo_o$suffix\" in current context."
gdb_test "p fo_o$suffix" "No symbol \"fo_o$suffix\" in current context."

gdb_test "info locals" "ix_x = 11\r\niy_y = 22\r\niz_z = 33\r\nix = 1\r\niy = 2\r\niz = 3" "info locals out"
gdb_test "info common" "Contents of F77 COMMON block 'fo_o':\r\nix_x = 11\r\niy_y = 22\r\niz_z = 33\r\n\r\nContents of F77 COMMON block 'foo':\r\nix = 1\r\niy = 2\r\niz = 3" "info common out"

gdb_test "ptype ix" "type = $int4" "ptype ix out"
gdb_test "ptype iy" "type = $real4" "ptype iy out"
gdb_test "ptype iz" "type = $real8" "ptype iz out"
gdb_test "ptype ix_x" "type = $int4" "ptype ix_x out"
gdb_test "ptype iy_y" "type = $real4" "ptype iy_y out"
gdb_test "ptype iz_z" "type = $real8" "ptype iz_z out"

gdb_test "p ix" " = 1 *" "p ix out"
gdb_test "p iy" " = 2 *" "p iy out"
gdb_test "p iz" " = 3 *" "p iz out"
gdb_test "p ix_x" " = 11 *" "p ix_x out"
gdb_test "p iy_y" " = 22 *" "p iy_y out"
gdb_test "p iz_z" " = 33 *" "p iz_z out"

gdb_breakpoint [gdb_get_line_number "stop-here-in"]
gdb_continue_to_breakpoint "stop-here-in"

gdb_test "whatis foo$suffix" "No symbol \"foo$suffix\" in current context." "whatis foo$suffix in"
gdb_test "ptype foo$suffix" "No symbol \"foo$suffix\" in current context." "ptype foo$suffix in"
gdb_test "p foo$suffix" "No symbol \"foo$suffix\" in current context." "p foo$suffix in"
gdb_test "whatis fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "whatis fo_o$suffix in"
gdb_test "ptype fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "ptype fo_o$suffix in"
gdb_test "p fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "p fo_o$suffix in"

gdb_test "info locals" "ix = 11\r\niy2 = 22\r\niz = 33\r\nix_x = 1\r\niy_y = 2\r\niz_z2 = 3\r\niy = 5\r\niz_z = 55" "info locals in"
gdb_test "info common" "Contents of F77 COMMON block 'fo_o':\r\nix = 11\r\niy2 = 22\r\niz = 33\r\n\r\nContents of F77 COMMON block 'foo':\r\nix_x = 1\r\niy_y = 2\r\niz_z2 = 3" "info common in"

gdb_test "ptype ix" "type = $int4" "ptype ix in"
gdb_test "ptype iy2" "type = $real4" "ptype iy2 in"
gdb_test "ptype iz" "type = $real8" "ptype iz in"
gdb_test "ptype ix_x" "type = $int4" "ptype ix_x in"
gdb_test "ptype iy_y" "type = $real4" "ptype iy_y in"
gdb_test "ptype iz_z2" "type = $real8" "ptype iz_z2 in"

gdb_test "p ix" " = 11 *" "p ix in"
gdb_test "p iy2" " = 22 *" "p iy2 in"
gdb_test "p iz" " = 33 *" "p iz in"
gdb_test "p ix_x" " = 1 *" "p ix_x in"
gdb_test "p iy_y" " = 2 *" "p iy_y in"
gdb_test "p iz_z2" " = 3 *" "p iz_z2 in"
