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

# Until "set follow-fork-mode" and "catch fork" are implemented on
# other targets...
#
if { ![istarget "*-*-linux*"] } then {
    unsupported "inferior-died.exp"
    continue
}

if { ![support_displaced_stepping] } {
    unsupported "inferior-died.exp"
    return -1
}

standard_testfile .c

if { [build_executable "failed to build" ${testfile} ${testfile}.c] } {
    return -1
}

save_vars { GDBFLAGS } {
    append GDBFLAGS " -ex \"set non-stop on\""
    clean_restart ${binfile}
}

gdb_test_no_output "set detach-on-fork off"

if ![runto_main] {
    return
}

set line [gdb_get_line_number "Break here"]
gdb_breakpoint $srcfile:$line

gdb_continue_to_breakpoint "breakpoint"

gdb_test "inferior 2" "Switching to inferior 2.*"

# The inferior 1 exit may come unexpectedly in any moment.
set test "continue"
set seen 0
gdb_test_multiple $test $test {
    -re "($gdb_prompt |\\\[Inferior \[^\r\n\]* exited normally\\\])" {
	incr seen
	if {$seen < 3} {
	    exp_continue
	}
	pass $test
    }
}

# Internal error may show up after all the messages above.
gdb_test "p 1" " = 1"
