# Copyright 2014-2023 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/>.
load_lib dwarf.exp

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

standard_testfile main.c -dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
 	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_Ada95}
                {DW_AT_name     foo.adb}
                {DW_AT_comp_dir /tmp}
	        {MACRO_AT_range {main}}
            } {
	    declare_labels boolean_label typedef_label array_label enum_label

            boolean_label: DW_TAG_base_type {
                {DW_AT_byte_size 1 DW_FORM_sdata}
                {DW_AT_encoding  @DW_ATE_boolean}
                {DW_AT_name      boolean}
            }

            typedef_label: DW_TAG_typedef {
                {DW_AT_name pck__table}
                {DW_AT_type :$array_label}
            }

	    array_label: DW_TAG_array_type {
		{DW_AT_name pck__table}
		{DW_AT_type :$boolean_label}
	    } {
		DW_TAG_subrange_type {
		    {DW_AT_type        :$enum_label}
		    {DW_AT_lower_bound 0   DW_FORM_data1}
		    {DW_AT_upper_bound 128 DW_FORM_data1}
		}
	    }

	    enum_label: DW_TAG_enumeration_type {
		{DW_AT_name      pck__enum_t}
                {DW_AT_byte_size 1 DW_FORM_sdata}
            } {
                DW_TAG_enumerator {
                    {DW_AT_name        pck__enum_000}
                    {DW_AT_const_value 0 DW_FORM_sdata}
                }
                DW_TAG_enumerator {
                    {DW_AT_name        pck__enum_001}
                    {DW_AT_const_value 1 DW_FORM_sdata}
                }
                DW_TAG_enumerator {
                    {DW_AT_name        pck__enum_128}
                    {DW_AT_const_value 128 DW_FORM_sdata}
                }
	    }
	}
    }
}

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

gdb_test_no_output "set language ada"

gdb_test "ptype pck.table" \
         "type = array \\(enum_000 \\.\\. enum_128\\) of boolean"
