# Copyright 2008, 2009, 2010, 2011 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 . if $tracelevel then { strace $tracelevel } if { [skip_cplus_tests] } { continue } set testfile "nextoverthrow" set srcfile ${testfile}.cc set binfile $objdir/$subdir/$testfile # Create and source the file that provides information about the compiler # used to compile the test case. if [get_compiler_info ${binfile} "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} { 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