#   Copyright 1998, 1999 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

if $tracelevel then {
	strace $tracelevel
	}

set prms_id 0
set bug_id 0

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 additional_flags=-w}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }


# 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.
#
send_gdb "break 22\n"
set bp_on_non_call 0
gdb_expect {
  -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"}
  -re "$gdb_prompt $"\
          {fail "break before jump to non-call"}
  timeout {fail "(timeout) break before jump to non-call"}
}

# Can we jump to the statement?  Do we stop there?
#
send_gdb "jump 22\n"
gdb_expect {
  -re "Breakpoint \[0-9\]*, .*${srcfile}:22.*$gdb_prompt $"\
          {pass "jump to non-call"}
  -re "$gdb_prompt $"\
          {fail "jump to non-call"}
  timeout {fail "(timeout) jump to non-call"}
}

# Set a breakpoint on the statement that we're about to jump to.
# The statement does contain a function call.
#
send_gdb "break 21\n"
set bp_on_call 0
gdb_expect {
  -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"}
  -re "$gdb_prompt $"\
          {fail "break before jump to call"}
  timeout {fail "(timeout) break before jump to call"}
}

# Can we jump to the statement?  Do we stop there?
#
send_gdb "jump 21\n"
gdb_expect {
  -re "Breakpoint \[0-9\]*, .*${srcfile}:21.*$gdb_prompt $"\
          {pass "jump to call"}
  -re "$gdb_prompt $"\
          {fail "jump to call"}
  timeout {fail "(timeout) 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?
#
send_gdb "disable $bp_on_call\n"
gdb_expect {
  -re "$gdb_prompt $"\
          {pass "disable breakpoint on call"}
  timeout {fail "(timeout) disable breakpoint on call"}
}

send_gdb "jump 21\n"
gdb_expect {
  -re "Breakpoint \[0-9\]*, .*${srcfile}:22.*$gdb_prompt $"\
          {pass "jump to call with disabled breakpoint"}
  -re "$gdb_prompt $"\
          {fail "jump to call with disabled breakpoint"}
  timeout {fail "(timeout) jump to call with disabled breakpoint"}
}

# Verify that GDB responds gracefully to the "jump" command without
# an argument.
#
send_gdb "jump\n"
gdb_expect {
  -re "Argument required .starting address..*$gdb_prompt $"\
          {pass "jump without argument disallowed"}
  -re "$gdb_prompt $"\
          {fail "jump without argument disallowed"}
  timeout {fail "(timeout) jump without argument disallowed"}
}

# Verify that GDB responds gracefully to the "jump" command with
# trailing junk.
#
send_gdb "jump 21 100\n"
gdb_expect {
  -re "Junk at end of line specification: 100.*$gdb_prompt $"\
          {pass "jump with trailing argument junk"}
  -re "$gdb_prompt $"\
          {fail "jump with trailing argument junk"}
  timeout {fail "(timeout) 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.
#
send_gdb "jump 12\n"
gdb_expect {
  -re "Line 12 is not in `main'.  Jump anyway.*y or n. $"\
          {send_gdb "n\n"
           gdb_expect {
             -re "Not confirmed.*$gdb_prompt $"\
                     {pass "aborted jump out of current function"}
             -re "$gdb_prompt $"\
                     {fail "aborted jump out of current function"}
             timeout {fail "(timeout) aborted jump out of current function"}
           }
          }
  -re "$gdb_prompt $"\
          {fail "aborted jump out of current function"}
  timeout {fail "(timeout) aborted jump out of current function"}
}

send_gdb "jump 12\n"
gdb_expect {
  -re "Line 12 is not in `main'.  Jump anyway.*y or n. $"\
          {send_gdb "y\n"
           gdb_expect {
             -re "Continuing at.*$gdb_prompt $"\
                     {pass "jump out of current function"}
             -re "$gdb_prompt $"\
                     {fail "jump out of current function"}
             timeout {fail "(timeout) jump out of current function"}
           }
          }
  -re "$gdb_prompt $"\
          {fail "jump out of current function"}
  timeout {fail "(timeout) jump out of current function"}
}

gdb_exit
return 0
