# Copyright 2003-2023 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/>.  */

# until.exp -- Expect script to test 'until' in gdb

set srcfile break.c
if { [prepare_for_testing "failed to prepare" "until" {break.c break1.c} {debug nowarnings}] } {
    return -1
}

set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
set bp_location19 [gdb_get_line_number "set breakpoint 19 here"]
set bp_location20 [gdb_get_line_number "set breakpoint 20 here"]
set bp_location21 [gdb_get_line_number "set breakpoint 21 here"]

if {![runto_main]} {
    return 0
}

# Verify that "until <location>" works.  (This is really just syntactic
# sugar for "tbreak <location>; continue".)
#
gdb_test "until $bp_location1" \
	"main .* at .*:$bp_location1.*" \
	"until line number"

# Verify that a malformed "advance" is gracefully caught.
#
gdb_test "until 80 then stop" \
    "malformed linespec error: unexpected string, \"then stop\"" \
    "malformed until"

# Rerun up to factorial, outer invocation
if { ![runto factorial] } {
    return
}

delete_breakpoints

# At this point, 'until' should continue the inferior up to when all the
# inner invocations of factorial() are completed and we are back at this
# frame.
#
gdb_test "until $bp_location19" \
	"factorial.*value=720.*at.*${srcfile}:$bp_location19.*return \\(value\\).*" \
	"until factorial, recursive function"

# Run to a function called by main
#
if { ![runto marker2] } {
    return
}

delete_breakpoints

# Now issue an until with another function, not called by the current
# frame, as argument. This should not work, i.e. the program should
# stop at main, the caller, where we put the 'guard' breakpoint.
#
gdb_test "until marker3" \
	"($hex in |)main.*argc.*argv.*envp.*at.*${srcfile}:($bp_location20.*marker2 \\(43\\)|$bp_location21.*marker3 \\(.stack., .trace.\\)).*" \
	"until func, not called by current frame"

