# Copyright (C) 2024-2025 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 accessing an empty linetable in Python.

load_lib dwarf.exp
load_lib gdb-python.exp

require dwarf2_support allow_python_tests

standard_testfile .c -dw.S

set asm_file [standard_output_file ${srcfile2}]
Dwarf::assemble $asm_file {

    cu {} {
	compile_unit {
	    {language @DW_LANG_C}
	    {name py-linetable-empty.c}
	} {
	    subprogram {
			{MACRO_AT_func {main}}
	    }
	}
    }
}

if { [prepare_for_testing "failed to prepare" ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

if ![runto_main] {
	return -1
}

gdb_test "python print(gdb.selected_frame().function().symtab.fullname())" \
	"py-linetable-empty.c" "Test main has symtab"

# Get the linetable for main's symbol table. This is empty as we didn't include
# a linetable in the debug info.
gdb_py_test_silent_cmd "python lt = gdb.selected_frame().function().symtab.linetable()" \
    "get linetable" 0

gdb_test "python print(lt.is_valid())" "True" \
	"Test linetable is valid"

gdb_test "python print(lt.line(1))" "None" \
	"Test line() returns None"

gdb_test "python print(lt.has_line(1))" \
	"RuntimeError.*: Linetable information not found in symbol table.*" \
	"Test has_line() throws exception"

gdb_test "python print(lt.source_lines())" \
	"RuntimeError.*: Linetable information not found in symbol table.*" \
	"Test source_lines() throws exception"

gdb_test "python print(list(lt))" "\\\[\\\]" \
	"Test iterating over linetable"
