#   Copyright 1998-1999, 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/>.  */


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" \
    "malformed linespec error: unexpected number, \"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
