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

load_lib "fortran.exp"

if {[skip_fortran_tests]} { return -1 }

standard_testfile .f90

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

# Test automatic language detection before the inferior starts.  It tests the
# effect of expected:
# (gdb) show language 
# The current source language is "auto; currently fortran".
gdb_test "p modmany::var_i" " = 14" "stopped language detection"

gdb_test "print mod1::var_const" " = 20" "fully qualified name of DW_TAG_constant"

# Avoid shared lib symbols.
gdb_test_no_output "set auto-solib-add off"

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

# Avoid libc symbols.
gdb_test "nosharedlibrary"

set int_type [fortran_int4]

# Test 'info variables' can find module variables.
set mod_re \
    [multi_line \
	 "18:\[ \t\]+${int_type} mod1::var_const;" \
	 "17:\[ \t\]+${int_type} mod1::var_i;" \
	 "23:\[ \t\]+${int_type} mod2::var_i;" \
	 "28:\[ \t\]+${int_type} mod3::mod1;" \
	 "27:\[ \t\]+${int_type} mod3::mod2;" \
	 "29:\[ \t\]+${int_type} mod3::var_i;" \
	 "33:\[ \t\]+${int_type} modmany::var_a;" \
	 "33:\[ \t\]+${int_type} modmany::var_b;" \
	 "33:\[ \t\]+${int_type} modmany::var_c;" \
	 "33:\[ \t\]+${int_type} modmany::var_i;" \
	 "37:\[ \t\]+${int_type} moduse::var_x;" \
	 "37:\[ \t\]+${int_type} moduse::var_y;"]

set state 0
gdb_test_multiple "info variables -n" "" {
    -re "\r\nAll defined variables:" {
	if { $state == 0 } { set state 1 }
	exp_continue
    }
    -re "\r\n\r\nFile .*[string_to_regexp $srcfile]:" {
	if { $state == 1 } { set state 2 }
	exp_continue
    }
    -re $mod_re	{
	if { $state == 2 } { set state 3 }
	exp_continue
    }
    -re "\r\n\r\nFile \[^\r\n\]*:" {
	exp_continue
    }
    -re -wrap "" {
	if { $state == 3} {
	    pass $gdb_test_name
	} else {
	    fail $gdb_test_name
	}
    }
}

# Do not use simple single-letter names as GDB would pick up for expectedly
# nonexisting symbols some static variables from system libraries debuginfos.

gdb_breakpoint [gdb_get_line_number "i-is-1"]
gdb_continue_to_breakpoint "i-is-1" ".*i-is-1.*"
gdb_test "print var_i" " = 1" "print var_i value 1"

gdb_breakpoint [gdb_get_line_number "i-is-2"]
gdb_continue_to_breakpoint "i-is-2" ".*i-is-2.*"
gdb_test "print var_i" " = 2" "print var_i value 2"

gdb_breakpoint [gdb_get_line_number "i-is-3"]
gdb_continue_to_breakpoint "i-is-3" ".*i-is-3.*"
# Ensure that the scope is correctly resolved.
gdb_test "p mod3" "Attempt to use a type name as an expression" "print mod3"
gdb_test "p mod2" " = 3" "print mod2"
gdb_test "p mod1" " = 3" "print mod1"

gdb_breakpoint [gdb_get_line_number "a-b-c-d"]
gdb_continue_to_breakpoint "a-b-c-d" ".*a-b-c-d.*"
gdb_test "print var_a" "No symbol \"var_a\" in current context\\."
gdb_test "print var_b" " = 11"
gdb_test "print var_c" "No symbol \"var_c\" in current context\\."
gdb_test "print var_d" " = 12"
gdb_test "print var_i" " = 14" "print var_i value 14"
gdb_test "print var_x" " = 30" "print var_x value 30"
gdb_test "print var_y" "No symbol \"var_y\" in current context\\."
gdb_test "print var_z" " = 31" "print var_x value 31"

gdb_test "ptype modmany" "type = module modmany"

proc complete {expr list} {
    set cmd "complete p $expr"
    set expect [join [concat [list $cmd] $list] "\r\np "]
    gdb_test $cmd $expect "complete $expr"
}
set modmany_list {modmany::var_a modmany::var_b modmany::var_c modmany::var_i}
complete "modm" "modmany $modmany_list"
complete "modmany" "modmany $modmany_list"
complete "modmany::" $modmany_list
complete "modmany::var" $modmany_list

# Breakpoint would work in language "c".
gdb_test "show language" {The current source language is "(auto; currently )?fortran".}

# gcc-4.4.2: The main program is always $fmain in .symtab so "runto" above
# works.  But DWARF DW_TAG_subprogram contains the name specified by
# the "program" Fortran statement.
if [gdb_breakpoint "module"] {
    pass "setting breakpoint at module"
}
