# Copyright 2020-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/>.
#
# Test-case to verify that symbol-less symtabs are expanded by
# "maint expand-symtabs".

standard_testfile .c

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

# Make sure that no symtabs are expanded, by setting language before
# loading exec.
gdb_test_no_output "set language c"
gdb_load ${binfile}

set test "verify no symtabs are expanded"
if { [readnow] } {
    unsupported $test
    return -1
}
gdb_test_no_output "maint info symtabs" $test

# Expand the header file symtab.
gdb_test_no_output "maint expand-symtabs maint-expand-symbols-header-file.h"

# Check that the include symtab was in fact expanded.
set file_re "\[^\r\n\]*/maint-expand-symbols-header-file.h"
gdb_test "maint info symtabs" \
    "\r\n\t{ symtab $file_re \\(\\(struct symtab \\*\\) $hex\\)\r\n.*" \
    "check header file psymtab expansion"

# Check that the symtab the include symtab was referring to was expanded.
set file_re "\[^\r\n\]*/maint-expand-symbols-header-file.c"
gdb_test "maint info symtabs" \
    "\r\n\t{ symtab $file_re \\(\\(struct symtab \\*\\) $hex\\)\r\n.*" \
    "check source file psymtab expansion"
