# This testcase is part of GDB, the GNU debugger.

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

# Test that checks if we handle a SIGSEGV,SIGILL caused by gdb in the inferior
# even if we have noprint,nostop options set in handle SIGSEV,SIGILL
# See PR breakpoints/16812

standard_testfile

# Some targets can't call functions, so don't even bother with this
# test.
require {!target_info exists gdb,cannot_call_functions}

set dp_location [gdb_get_line_number "set dprintf here"]
set bp_location [gdb_get_line_number "set breakpoint here"]

set flags {}
lappend flags debug
lappend_include_file flags $srcdir/lib/unbuffer_output.c

if {[prepare_for_testing "failed to prepare" $testfile $srcfile $flags]} {
    return -1
}

if ![runto_main] {
    return -1
}

gdb_test "handle SIGSEGV nostop noprint" \
    "Signal\[ \t\]+Stop\[ \t\]+Print\[ \t\]+Pass to program\[ \t\]+Description\r\nSIGSEGV\[ \t\]+No\[ \t\]+No\[ \t\]+Yes\[ \t\].*"
gdb_test "handle SIGILL nostop noprint" \
    "Signal\[ \t\]+Stop\[ \t\]+Print\[ \t\]+Pass to program\[ \t\]+Description\r\nSIGILL\[ \t\]+No\[ \t\]+No\[ \t\]+Yes\[ \t\].*"

gdb_test "print return_one()" " = 1"

if ![target_info exists gdb,noinferiorio] {

    # Clean up the breakpoint state.
    delete_breakpoints

    gdb_breakpoint $bp_location

    gdb_test_no_output "set dprintf-style call"

    # Also test with dprintf since the original bug was noticed using dprintf.
    gdb_test "dprintf $dp_location,\"testdprintf\\n\"" "Dprintf .*"

    gdb_test_stdio "continue" "testdprintf"
}
