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

# This file is part of the GDB testsuite.  It tests exercises PR 18833.

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

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile
set pyfile ${testfile}-gdb.py

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "failed to compile"
    return -1
}

if { [mi_skip_python_tests] } { continue }

# Make the -gdb.py script available to gdb, it is automagically loaded by gdb.
# Care is taken to put it in the same directory as the binary so that
# gdb will find it.
set remote_python_file [gdb_remote_download host ${srcdir}/${subdir}/${pyfile}]

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_test "set auto-load safe-path ${remote_python_file}" \
    {.*\^done} \
    "set safe-path"

if [is_remote host] {
    set filename ${testfile}
    remote_download host ${binfile} ${filename}
} else {
    set filename ${binfile}
}

# PR 18833.  This will cause an unpatched gdb to crash.
mi_gdb_test "-file-exec-and-symbols ${filename}" \
    ".*main \\(.*void\\).*\
    return 0;.*\\^done" \
    "file-exec-and-symbols operation"
