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


if { [skip_cplus_tests] } { continue }

standard_testfile .cc

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info "c++"] {
    untested nextoverthrow.exp
    return -1
}

if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
    return -1
}

if ![runto_main] then {
    perror "couldn't run to main"
    continue
} 

# See whether we have the needed unwinder hooks.
set ok 1
gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook" {
    -re "= .*no debug info.*_Unwind_DebugHook.*\r\n$gdb_prompt $" {
	# Pass the test so we don't get bogus fails in the results.
	pass "check for unwinder hook"
	set ok 0
    }
    -re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" {
	pass "check for unwinder hook"
    }
    -re "No symbol .* in current context.\r\n$gdb_prompt $" {
	# Pass the test so we don't get bogus fails in the results.
	pass "check for unwinder hook"
	set ok 0
    }
}
if {!$ok} {
    gdb_test_multiple "info probe" "check for stap probe in unwinder" {
	-re ".*libgcc.*unwind.*\r\n$gdb_prompt $" {
	    pass "check for stap probe in unwinder"
	    set ok 1
	}
	-re "\r\n$gdb_prompt $" {
	}
    }
}

if {!$ok} {
    unsupported "nextoverthrow.exp could not find _Unwind_DebugHook"
    return -1
}

# Set a temporary breakpoint and then continue to it.
# The breakpoint is set according to a marker in the file.
proc tbreak_and_cont {text} {
    global testfile

    set line [gdb_get_line_number $text $testfile.cc]
    gdb_breakpoint "$testfile.cc:$line" temporary
    gdb_test "continue" "Temporary breakpoint.*" "continuing to $text"
}

# Verify the value of testval.
proc verify_testval {name value} {
    gdb_test "print testval == $value" " = true" $name
}

# See http://sourceware.org/bugzilla/show_bug.cgi?id=9593
# Our general approach here is to do some operation, verify
# that testval has not changed, continue to the location at
# which the next test starts, and verify testval again.
# This works around platform differences in debuginfo that
# make looking at the source line unreliable.

# A simple test of next over a throw.
tbreak_and_cont "Start: first test"
gdb_test "next" ".*" "next over a throw 1"
tbreak_and_cont "End: first test"
verify_testval "pre-check - next over a throw 1" -1

tbreak_and_cont "Start: nested throw"
verify_testval "post-check - next over a throw 1" 0
gdb_test "next" ".*" "next over a throw 2"
tbreak_and_cont "End: nested throw"
verify_testval "pre-check - next over a throw 2" 0

tbreak_and_cont "Start: step in test"
verify_testval "post-check - next over a throw 2" 1
gdb_test "step" "function1().*" "step into function2 1"
gdb_test "next" ".*" "next over a throw 3"
tbreak_and_cont "End: step in test"
verify_testval "pre-check - next over a throw 3" 1

tbreak_and_cont "Start: next past catch"
verify_testval "post-check - next over a throw 3" 2
gdb_test "next" ".*" "next past catch"
tbreak_and_cont "End: next past catch"
verify_testval "pre-check - next past catch" 2

tbreak_and_cont "Start: rethrow"
verify_testval "post-check - next past catch" 3
gdb_test "next" ".*" "next over a throw 4"
tbreak_and_cont "End: rethrow"
verify_testval "pre-check - next over a throw 4" 3

tbreak_and_cont "Start: first finish"
verify_testval "post-check - next over a throw 4" 4
gdb_test "step" "function1().*" "step into function2 2"
gdb_test "finish" ".*" "finish 1"
tbreak_and_cont "End: first finish"
verify_testval "pre-check - finish 1" 4

tbreak_and_cont "Start: second finish"
verify_testval "post-check - finish 1" 5
gdb_test "step" "function1 ().*" "step into finish method"
gdb_test "finish" ".*" "finish 2"
tbreak_and_cont "End: second finish"
verify_testval "pre-check - finish 2" 5

tbreak_and_cont "Start: first until"
verify_testval "post-check - finish 2" 6
gdb_test "step" ".*" "step into finish, for until"
gdb_test "until" ".*" "until with no argument 1"
set line [gdb_get_line_number "marker for until" $testfile.cc]
gdb_test "until $line" "function1 ().*" "next past catch 6"
gdb_test "until" ".*" "until with no argument 2"
tbreak_and_cont "End: first until"
verify_testval "pre-check - until 1" 6

tbreak_and_cont "Start: second until"
verify_testval "post-check - until 1" 7
set line [gdb_get_line_number "until here" $testfile.cc]
gdb_test "step" "function1 ().*" "step into until"
gdb_test "until $line" ".*" "until-over-throw"
tbreak_and_cont "End: second until"
verify_testval "pre-check - until 2" 7

tbreak_and_cont "Start: advance"
verify_testval "post-check - until 2" 8
gdb_test "step" "function1 ().*" "step into until, for advance"
gdb_test "advance $line" ".*" "advance-over-throw"
tbreak_and_cont "End: advance"
verify_testval "pre-check - advance" 8

tbreak_and_cont "Start: resumebpt"
gdb_test "tbreak _Unwind_RaiseException"
gdb_test "continue" "Temporary breakpoint.*" "continuing to _Unwind_RaiseException"
gdb_test "finish" "Run till exit .*"
gdb_test {set $retpc=$pc}
gdb_test {break *$retpc if dummy ()}
tbreak_and_cont "Second: resumebpt"
gdb_test "next"

tbreak_and_cont "done"
verify_testval "post-check - advance" 10
