# Copyright 2013-2020 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.
if {![dwarf2_support]} {
    return 0  
}

if { [skip_cplus_tests] } { continue }

standard_testfile method-ptr.cc subrange-dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
 	compile_unit {{language @DW_LANG_Pascal83}} {
	    declare_labels byte_label typedef_label array_label

	    byte_label: base_type {
		{name byte}
		{encoding @DW_ATE_unsigned}
		{byte_size 1 DW_FORM_sdata}
	    }

	    typedef_label: typedef {
		{name byte_typedef}
		{type :$byte_label}
	    }

	    array_label: array_type {
		{type :$byte_label}
	    } {
		subrange_type {
		    {lower_bound 0 DW_FORM_sdata}
		    {upper_bound 191 DW_FORM_sdata}
		    {byte_stride 2 DW_FORM_sdata}
		    {type :$typedef_label}
		}
	    }

	    typedef {
		{name TByteArray}
		{type :$array_label}
	    }
	}
    }
}

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

gdb_test_no_output "set language pascal"

gdb_test "ptype TByteArray" \
    "type = array \\\[0\\.\\.191\\\] of byte"
