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

load_lib mi-support.exp
set MIFLAGS "-i=mi"

# The purpose of this testcase is to test the --start option of
# the -exec-run command. If we cannot use the -exec-run command,
# then there is no point in running this testcase...
require !use_gdb_stub

standard_testfile mi-start.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested "could not build mi-start"
     return -1
}

if {[mi_clean_restart $::testfile]} {
    return
}

# First, verify that the debugger correctly advertises support
# for the --start option of the -exec-run command.
mi_gdb_test "-list-features" \
	    "\\^done,features=\\\[.*\"exec-run-start-option\".*\\\]" \
	    "-list-features includes \"exec-run-start-option\""

mi_run_cmd "--start"
mi_expect_stop "breakpoint-hit" "main" "" ".*mi-start.c" "$decimal" \
{ "" "disp=\"del\"" } "run to main"
