# Copyright 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 handling of an array type whose bound comes from the field of a
# structure.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
require dwarf2_support

standard_testfile .c -debug.S

# Set up the DWARF for the test.

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    global srcdir subdir srcfile

    cu {} {
	DW_TAG_compile_unit {
		{DW_AT_language @DW_LANG_Ada95}
		{DW_AT_name	$srcfile}
	} {
	    declare_labels byte array disc struct

	    byte: DW_TAG_base_type {
		{DW_AT_byte_size 1 DW_FORM_sdata}
		{DW_AT_encoding	 @DW_ATE_unsigned}
		{DW_AT_name	 byte}
	    }

	    array: DW_TAG_array_type {
		{DW_AT_name array_type}
		{DW_AT_type :$byte}
	    } {
		DW_TAG_subrange_type {
		    {DW_AT_type	       :$byte}
		    {DW_AT_upper_bound :$disc}
		}
	    }

	    struct: DW_TAG_structure_type {
		{DW_AT_name discriminated}
		{DW_AT_byte_size 4 DW_FORM_sdata}
	    } {
		disc: DW_TAG_member {
		    {DW_AT_name disc}
		    {DW_AT_type :$byte}
		    {DW_AT_data_member_location 0 DW_FORM_sdata}
		}
		DW_TAG_member {
		    {DW_AT_name nums}
		    {DW_AT_type :$array}
		    {DW_AT_data_member_location 1 DW_FORM_sdata}
		}
	    }

	    DW_TAG_variable {
		{DW_AT_name "value"}
		{DW_AT_type :$struct}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "our_data"]}
		    SPECIAL_expr}
	    }
	}
    }
}

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

gdb_test_no_output "set language ada"
gdb_test "print value" \
    [string_to_regexp " = (disc => 3, nums => (7, 11, 13))"]
