# Copyright (C) 2011-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/>.

standard_testfile

require support_displaced_stepping

# The testfile uses "run".  The real bug happened only for ![is_remote target].
require !use_gdb_stub

save_vars { GDBFLAGS } {
    set GDBFLAGS "$GDBFLAGS -ex \"set non-stop on\""
    if { [prepare_for_testing "failed to prepare" ${testfile} $srcfile] } {
	return -1
    }
}

set gdbindex_warning_re "warning: Skipping \[^\r\n\]+ \\.gdb_index section \[^\r\n\]*\r\nDo \"set use-deprecated-index-sections on\" before the file is read\r\nto use the section anyway\\."

gdb_test -no-prompt-anchor "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?"

# `sleep 5' here would workaround the bug, do not sleep here.
# "shell" could eat waitpid event from the asynchronous inferior process.

gdb_test "shell echo foo" "foo"

set test "interrupt"
gdb_test_multiple $test $test {
    -re "interrupt\r\n$gdb_prompt " {
	pass $test
    }
}

set test "process stopped"
gdb_test_multiple "" $test {
    -re "Program stopped\\\.\r\n" {
	pass $test
    }
}
