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

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

set srcfile break.c
if { [prepare_for_testing until.exp "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 {
    fail "Can't run to 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] } then { gdb_suppress_tests; }
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] } then { gdb_suppress_tests; }
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"

