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

# Test that repeating a background command doesn't lose the "&" in the
# repeat, turning a background command into a foreground command.  See
# PR gdb/17471.

standard_testfile

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

set linenum [gdb_get_line_number "set break here"]

# Run the test proper.  CONTINUE_CMD is the background continue
# command to issue.

proc test {continue_cmd} {
    global gdb_prompt
    global binfile
    global linenum

    clean_restart $binfile

    if ![runto_main] {
	return
    }

    gdb_breakpoint "$linenum"

    set test $continue_cmd
    gdb_test_multiple $test $test {
	-re "Continuing\\.\r\n$gdb_prompt " {
	    # Note no end anchor.  If the breakpoint triggers soon enough
	    # enough we see further output after the prompt.
	    pass $test
	}
    }

    # Wait for the stop.  Don't expect a prompt, as we had resumed the
    # inferior in the background.
    set test "breakpoint hit 1"
    gdb_test_multiple "" $test {
	-re "set break here" {
	    pass $test
	}
    }

    # Trigger a repeat.  Buggy GDB used to lose the "&", making this a
    # foreground command...
    send_gdb "\n"
    gdb_test "" "Continuing\\." "repeat bg command"

    # ... and thus further input wouldn't be processed until the target
    # stopped.
    gdb_test "print 1" " = 1" "input still accepted"

    # Make sure we see a stop after the print, and not before.  Don't
    # expect a prompt, as we had resumed the inferior in the background.
    set test "breakpoint hit 2"
    gdb_test_multiple "" $test {
	-re "set break here ..\r\n" {
	    pass $test
	}
    }
}

# Test with and without extra arguments.
foreach cmd {"c&" "c 1&"} {
    with_test_prefix $cmd {
	test $cmd
    }
}
