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

# Test for watchpoints with conditions that involve inferior function
# calls.

standard_testfile

if [target_info exists gdb,cannot_call_functions] {
    unsupported "can not call functions"
    return
}

if { [build_executable ${testfile}.exp ${testfile} ${testfile}.c {debug}] } {
    untested "failed to compile"
    return -1
}

proc test_watchpoint { hw } {
    global testfile

    clean_restart ${testfile}

    if { ![runto_main] } then {
	return
    }

    if { ! $hw } {
	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
    }

    gdb_test "watch var if return_1 ()" "atchpoint .*: var"

    gdb_breakpoint [gdb_get_line_number "break-at-exit"]

    gdb_test "continue" \
	"atchpoint \[0-9\]+: var\r\n\r\nOld value = 0\r\nNew value = 1\r\n.*watchpoint-stop.*"
}

if { ![target_info exists gdb,no_hardware_watchpoints] } {
    with_test_prefix "hw" { test_watchpoint 1 }
}

with_test_prefix "sw" { test_watchpoint 0 }
