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

if { ![support_displaced_stepping] } { 
    unsupported "displaced stepping"
    return -1
}

# The testfile uses "run".  The real bug happened only for ![is_remote target].
if [target_info exists use_gdb_stub] {
    return 0
}

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_output "set non-stop on"
gdb_test "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
    }
}
