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

#
# Tests involving watchpoint conditions with local expressions.
#

set testfile "watch-cond"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
    untested ${testfile}.exp
    return -1
}

# Disable hardware watchpoints if necessary.
if [target_info exists gdb,no_hardware_watchpoints] {
    gdb_test_no_output "set can-use-hw-watchpoints 0" ""
}

if ![runto_main] then {
    fail "Can't run to main"
    return
}

gdb_test "watch global if q > 10" \
    "atchpoint .*: global" \
    "set write watchpoint on global variable, local condition"

gdb_test "continue" \
    "Old value = 10.*New value = 11.*" \
    "watchpoint with global expression, local condition evaluates in correct frame"

clean_restart ${testfile}

# Disable hardware watchpoints if necessary.
if [target_info exists gdb,no_hardware_watchpoints] {
    gdb_test_no_output "set can-use-hw-watchpoints 0" ""
}

if ![runto_main] then {
    fail "Can't run to main"
    return
}

gdb_test "watch q if q > 10" \
    "atchpoint .*: q" \
    "set write watchpoint on local variable, local condition"

gdb_test "continue" \
    "Old value = 10.*New value = 11.*" \
    "watchpoint with local expression, local condition evaluates in correct frame"

clean_restart ${testfile}

# Disable hardware watchpoints if necessary.
if [target_info exists gdb,no_hardware_watchpoints] {
    gdb_test_no_output "set can-use-hw-watchpoints 0" ""
}

if ![runto_main] then {
    fail "Can't run to main"
    return
}

gdb_test "watch global2" \
    "atchpoint.*" \
    "set write watchpoint on global2 variable"

gdb_test "continue" \
    "Old value = 0.*New value = 1.*" \
    "watchpoint on global2 variable triggers"

gdb_test_no_output "condition 2 *foo > 10" \
    "condition of watchpoint 2 changes"

gdb_test "continue" \
    ".*condition cannot be tested in the current scope.*Old value = 1.*New value = 2.*" \
    "watchpoint stops with untestable local expression"
