# Copyright 2013 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 0 2 8 {
 	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  {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
	  object {nodebug}] != ""} {
    return -1
}

if  {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} {
    return -1
}

if  {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \
	  "${binfile}" executable {c++}] != ""} {
    return -1
}

clean_restart ${testfile}

gdb_test_no_output "set language pascal"

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