# Copyright 2019-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 test checks how GDB handles missing source files around the
# 'list' and 'info source' commands.

standard_testfile

# Create a source file in the output directory.
set srcfile [standard_output_file main.c]
set fd [open "$srcfile" w]
puts $fd {
int
main ()
{
  return 0;
}
}
close $fd
set srcfile [remote_download host $srcfile]

# Compile the source file.
set options "debug"
if  { [gdb_compile "${srcfile}" "${binfile}" \
	   executable $options] != "" } {
    untested "failed to compile"
    return -1
}

# Now delete the source file.
remote_file host delete $srcfile

# Now start GDB, run to main and try to list the source.
clean_restart ${binfile}

if ![runto_main] then {
    return 0
}

gdb_test "list" "1\[ \t\]+in\[ \t\]+$srcfile"

gdb_test "info source" \
    [multi_line \
	 "info source" \
	 "Current source file is $srcfile\(" \
	 "Compilation directory is \[^\n\r\]+)?" \
	 "Source language is c." \
	 "Producer is \[^\n\r\]+" \
	 "Compiled with DWARF $decimal debugging format." \
	 "Does not include preprocessor macro info." ]

