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

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...
if [use_gdb_stub] {
     untested "cannot use -exec-run command"
     return -1
}

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile mi-start.c

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

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

# 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"

