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

# 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] then {
    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"

