# Copyright 2016-2024 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 testcase is supposed to test DWARF static link which is usually
# used together with nested functions.  

require allow_fortran_tests

standard_testfile .f90
load_lib "fortran.exp"

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

if {![fortran_runto_main]} {
    continue
}

# Test if we can set a breakpoint in a nested function
gdb_breakpoint "testnestedfuncs::sub_nested_outer"
gdb_continue_to_breakpoint "testnestedfuncs::sub_nested_outer" \
    ".*local_int = 19"

# Test if we can access local and
# non-local variables defined one level up.
gdb_breakpoint [gdb_get_line_number "! BP_outer"]
gdb_continue_to_breakpoint "! BP_outer" ".*! BP_outer"
gdb_test "print index" "= 13" "print index at BP_outer"
gdb_test_no_output "set variable index = 42"
gdb_test "print index" "= 42" "print index at BP_outer, manipulated"
gdb_test "print local_int" "= 19" "print local_int in outer function"

# Non-local variable should be affected in one frame up as well.
gdb_test "up"
gdb_test "print index" "= 42" "print index at BP1, one frame up"

# Test if we can set a breakpoint in a nested function
gdb_breakpoint "testnestedfuncs::sub_nested_inner"
gdb_continue_to_breakpoint "testnestedfuncs::sub_nested_inner" \
    ".*local_int = 17"

# Test if we can access local and
# non-local variables defined two level up.
gdb_breakpoint [gdb_get_line_number "! BP_inner"]
gdb_continue_to_breakpoint "! BP_inner" ".*! BP_inner"
gdb_test "print index" "= 42" "print index at BP_inner"
gdb_test "print v_state%code" "= 61" "print v_state%code at BP_inner"
gdb_test "print local_int" "= 17" "print local_int in inner function"

# Test if local variable is still correct.
gdb_breakpoint [gdb_get_line_number "! BP_outer_2"]
gdb_continue_to_breakpoint "! BP_outer_2" ".*! BP_outer_2"
gdb_test "print local_int" "= 19" \
  "print local_int in outer function, after sub_nested_inner"

# Test if we can set a breakpoint in public routine with the same name
# as the internal
gdb_breakpoint "sub_nested_outer"
gdb_continue_to_breakpoint "sub_nested_outer" \
    ".*name = 'sub_nested_outer external'"

# Test if we can set a breakpoint in public routine with the same name
# as the internal
gdb_breakpoint "sub_with_sub_nested_outer::sub_nested_outer"
gdb_continue_to_breakpoint \
    "sub_with_sub_nested_outer::sub_nested_outer" ".*local_int = 11"

# Test if we can set a breakpoint in public routine with the same name
# as the internal
gdb_breakpoint "mod1::sub_nested_outer"
gdb_continue_to_breakpoint "mod1::sub_nested_outer" \
    ".*name = 'sub_nested_outer_mod1'"

# Sanity check in main.
gdb_breakpoint [gdb_get_line_number "! BP_main"]
gdb_continue_to_breakpoint "! BP_main" ".*! BP_main"
gdb_test "print index" "= 42" "print index at BP_main"
gdb_test "print v_state%code" "= 59" "print v_state%code at BP_main"
