# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2016-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/>.

if [target_info exists gdb,nosignals] {
    verbose "Skipping branch-to-self.exp because of nosignals."
    continue
}

standard_testfile

if { [build_executable ${testfile}.exp ${testfile} $srcfile {debug}] == -1 } {
    return -1
}

with_test_prefix "single-step" {
    global testfile

    clean_restart ${testfile}
    if ![runto_main] {
	return -1
    }
    set line_num [gdb_get_line_number "loop-line" ${testfile}.c]

    gdb_test "break ${testfile}.c:${line_num}" "Breakpoint .*" \
	"set breakpoint"
    gdb_continue_to_breakpoint "hit breakpoint"
    gdb_test "si" ".*${testfile}.c:${line_num}.*"
}

with_test_prefix "break-cond" {
    global testfile

    foreach_with_prefix side {"host" "target"} {

	clean_restart ${testfile}

	if ![runto_main] {
	    return -1
	}

	set test "set breakpoint condition-evaluation $side"
	gdb_test_multiple $test $test {
	    -re "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead.\r\n$gdb_prompt $" {
		# Target doesn't support breakpoint condition
		# evaluation on its side.  Skip the test.
		continue
	    }
	    -re "^$test\r\n$gdb_prompt $" {
	    }
	}

	set line_num [gdb_get_line_number "loop-line" ${testfile}.c]
	gdb_test "break ${testfile}.c:${line_num} if counter > 3" \
	    "Breakpoint .*" "set breakpoint with condition"

	gdb_continue_to_breakpoint "continue to break"

	gdb_test "p counter" ".* = 5"
    }
}
