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

# C test-case that mimics gdb.ada/dgopt.exp.

standard_testfile .c main.c

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

clean_restart

# Set language explicitly, to avoid expanding the include-main.c CU for the
# language lookup (this is currently not required, but may be after
# integration of the no-more-psym branch).
# This to make sure that the source file lookup we do later triggers the
# symtab expansion.
gdb_test_no_output "set language c"

gdb_load $binfile

if { ! [readnow] } {
    # Verify that no CU was expanded.
    gdb_test_no_output "maint info symtab"
}

# List a line in include-main.c.  The tricky bit is that there's no code in
# include-main.c, so the file should not occur in the .debug_line info.
# GDB needs to find the file based on the CU's DW_AT_name/DW_AT_comp_dir.
set line [gdb_get_line_number "include" $srcfile]
gdb_test "list $srcfile:$line" "$line\[ \t\]*#include \"main.c\""

# For completeness, also try to list a line in the file that does contain
# code.
set line [gdb_get_line_number "main" $srcfile2]
gdb_test "list $srcfile2:$line" "$line\[ \t\]*main \\(void\\)\r\n.*"
