# 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 gdb.Symbol.artificial.

load_lib dwarf.exp
load_lib gdb-python.exp

require dwarf2_support allow_python_tests

# Just use a no-op main.
standard_testfile py-arch.c -dw.S

set asm_file [standard_output_file ${srcfile2}]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {
	    {language @DW_LANG_C}
	    {name py-sym-artificial.c}
	} {
	    declare_labels signed

	    signed: DW_TAG_base_type {
		{DW_AT_byte_size 1 DW_FORM_sdata}
		{DW_AT_encoding  @DW_ATE_signed}
		{DW_AT_name      bool}
	    }

	    DW_TAG_variable {
		{name the_variable}
		{DW_AT_type :$signed}
		{artificial 1 DW_FORM_flag_present}
	    }
	}
    }
}

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

if {![runto_main]} {
    return -1
}

gdb_py_test_silent_cmd "python v = gdb.lookup_symbol('the_variable')" \
    "get variable" 1
gdb_test "python print(v\[0\].is_artificial)" True \
    "variable is artificial"
