# Copyright 2014-2020 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] } {
    untested "could not run to 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!
