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

# Check that forking a process after a previous process was attached to unsets
# attach_flag.  This is done indirectly by inspecting GDB's quit prompt.

if ![can_spawn_for_attach] {
    return 0
}

standard_testfile
set executable $testfile

if [prepare_for_testing "failed to prepare" $executable] {
    return -1
}

set test_spawn_id [spawn_wait_for_attach $binfile]
set test_pid [spawn_id_get_pid $test_spawn_id]

set test "attach to process"
gdb_test "attach $test_pid" "Attaching to program.*" $test

set test "kill process"
gdb_test "kill" "" $test \
    "Kill the program being debugged.*y or n. $" "y"

set test "restart process"
gdb_test "start" "Starting program.*Temporary breakpoint .*" $test

set test "attempt kill via quit"
# The quit prompt should warn about killing the process, not about detaching the
# process, since this process was not attached to.
set ok 0
gdb_test_multiple "quit" $test {
    -re "will be killed.*.y or n. $" {
	set ok 1
	send_gdb "n\n"
	exp_continue
    }
    -re "will be detached.*.y or n. $" {
	send_gdb "n\n"
	exp_continue
    }
    -re "$gdb_prompt $" {
	gdb_assert $ok $test
    }
}

kill_wait_spawned_process $test_spawn_id
