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

set testname func-ptrs
set srcfile ${testname}.c
if { [prepare_for_testing "failed to prepare" ${testname} ${srcfile}] } {
    return -1
}

if { ![runto_main] } {
    return -1
}


# First set our breakpoints.

set fp_breakpoint_re \
    "Breakpoint $decimal at $hex: file .*${srcfile}, line $decimal\\."
gdb_test "break sentinel if calc == decr" \
    "${fp_breakpoint_re}" \
    "breakpoint at sentinel"
gdb_test "break incr" \
    "${fp_breakpoint_re}" \
    "breakpoint at incr"
gdb_test "break decr" \
    "${fp_breakpoint_re}" \
    "breakpoint at decr"


# Check if we run through to the breakpoint in incr.

gdb_test "continue" \
    "Breakpoint $decimal, incr \\(i=-1\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*" \
    "continue to incr, first time"


# Go back up, make sure the return value is 0.

gdb_test "finish" \
    "Run till exit from #0 +incr \\(i=-1\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+($hex in )?main \\(\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*Value returned is \\$$decimal = 0" \
    "go back to main from incr, first time"


# Redirect calc and see if we run to the breakpoint in decr instead.

gdb_test_no_output "set calc = decr" "set calc to decr"
gdb_test "continue" \
    "Breakpoint $decimal, decr \\(i=0\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*" \
    "continue to decr"


# Go back up, check if we stop in sentinel instead.

gdb_test "finish" \
    "Run till exit from #0 +decr \\(i=0\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+Breakpoint $decimal, sentinel \\(\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*" \
    "stop in sentinel"


# Go back all the way up to main, make sure the return value is -1.

gdb_test_no_output "up-silently" "move up to decr"
gdb_test "finish" \
    "Run till exit from #1 +($hex in )?decr \\(i=0\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+($hex in )?main \\(\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*Value returned is \\$$decimal = -1" \
    "go back to main from decr"


# Reset calc and see if we run to the breakpoint in incr again.

gdb_test_no_output "set calc = incr" "set calc to incr"
gdb_test "continue" \
    "Breakpoint $decimal, incr \\(i=-1\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*" \
    "continue to incr, second time"


# Go back up again, make sure the return value is 0.

gdb_test "finish" \
    "Run till exit from #0 +incr \\(i=-1\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+($hex in )?main \\(\\)\[ \r\n\]+at .*${srcfile}:$decimal\[\r\n\]+.*Value returned is \\$$decimal = 0" \
    "go back to main from incr, second time"


# All done!
