#   Copyright 1998-2013 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
