# Copyright 2013-2021 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 -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"
