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


clear_xfail "*-*-*"

standard_testfile .c

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


# Start with a fresh gdb

clean_restart ${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
set non_call_line [gdb_get_line_number "bp-on-non-call"]
gdb_test_multiple "break $non_call_line" "break before jump to non-call" {
    -re "\[Bb\]reakpoint (${decimal}) at ${hex}: file .*${srcfile}, line $non_call_line.*$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 $non_call_line" "Breakpoint ${decimal}, .*${srcfile}:$non_call_line.*" \
    "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
set call_line [gdb_get_line_number "bp-on-call"]
gdb_test_multiple "break $call_line" "break before jump to call" {
    -re "\[Bb\]reakpoint (${decimal}) at ${hex}: file .*${srcfile}, line $call_line.*$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 $call_line" \
    "Breakpoint ${decimal}, .*${srcfile}:$call_line.*" \
    "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 $call_line" "Breakpoint ${decimal}, .*${srcfile}:$non_call_line.*" \
    "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 $call_line 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.
#

set out_line [gdb_get_line_number "out-of-func"]
gdb_test "jump $out_line" \
    "Not confirmed.*" \
    "aborted jump out of current function" \
    "Line $out_line is not in `main'.  Jump anyway.*y or n. $" \
    "n"

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

gdb_exit
return 0
