#   Copyright 1998, 1999, 2007, 2008, 2009, 2010, 2011
#   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 $tracelevel then {
	strace $tracelevel
	}


clear_xfail "*-*-*"

set testfile "jump"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# Build the test case
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
     untested jump.exp
     return -1
    }


# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
  perror "Couldn't run to main"
  return -1
}

# Set a breakpoint on the statement that we're about to jump to.
# The statement doesn't contain a function call.
#
set bp_on_non_call 0
gdb_test_multiple "break 22" "break before jump to non-call" {
    -re "\[Bb\]reakpoint (\[0-9\]*) at 0x\[0-9a-fA-F\]*: file .*${srcfile}, line 22.*$gdb_prompt $" {
	set bp_on_non_call $expect_out(1,string)
	pass "break before jump to non-call"
    }
}

# Can we jump to the statement?  Do we stop there?
#
gdb_test "jump 22" "Breakpoint \[0-9\]*, .*${srcfile}:22.*" \
    "jump to non-call"

# Set a breakpoint on the statement that we're about to jump to.
# The statement does contain a function call.
#
set bp_on_call 0
gdb_test_multiple "break 21" "break before jump to call" {
    -re "\[Bb\]reakpoint (\[0-9\]*) at 0x\[0-9a-fA-F\]*: file .*${srcfile}, line 21.*$gdb_prompt $" {
	set bp_on_call $expect_out(1,string)
	pass "break before jump to call"
    }
}

# Can we jump to the statement?  Do we stop there?
#
gdb_test "jump 21" \
    "Breakpoint \[0-9\]*, .*${srcfile}:21.*" \
    "jump to call"

# If we disable the breakpoint at the function call, and then
# if we jump to that statement, do we not stop there, but at
# the following breakpoint?
#
gdb_test_no_output "disable $bp_on_call" "disable breakpoint on call"

gdb_test "jump 21" "Breakpoint \[0-9\]*, .*${srcfile}:22.*" \
    "jump to call with disabled breakpoint"

# Verify that GDB responds gracefully to the "jump" command without
# an argument.
#
gdb_test "jump" "Argument required .starting address.*" \
    "jump without argument disallowed"


# Verify that GDB responds gracefully to the "jump" command with
# trailing junk.
#
gdb_test "jump 21 100" \
    "Junk at end of line specification: 100.*" \
    "jump with trailing argument junk"


# Verify that GDB responds gracefully to a request to jump out of
# the current function.  (Note that this will very likely cause the
# inferior to die.  Be prepared to rerun the inferior, if further
# testing is desired.)
#
# Try it both ways: confirming and not confirming the jump.
#

gdb_test "jump 12" \
    "Not confirmed.*" \
    "aborted jump out of current function" \
    "Line 12 is not in `main'.  Jump anyway.*y or n. $" \
    "n"

gdb_test "jump 12" \
    "Continuing at.*" \
    "jump out of current function" \
    "Line 12 is not in `main'.  Jump anyway.*y or n. $" \
    "y"

gdb_exit
return 0
