# Copyright 2005, 2007, 2008, 2009, 2010 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/>.

# This file was written by Wu Zhou. (woodzltc@cn.ibm.com)

# This file is part of the gdb testsuite.  It contains tests for type-printing
# and value-printing Fortran derived types.

if $tracelevel then {
	strace $tracelevel
}

if { [skip_fortran_tests] } { return -1 }

set testfile "derived-type"
set srcfile ${testfile}.f90
set binfile ${objdir}/${subdir}/${testfile}

if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	 executable {debug f77}] != ""} {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto MAIN__] then {
    perror "couldn't run to breakpoint MAIN__"
    continue
}

# Depending on the compiler version being used, the name of the 4-byte integer
# and real types can be printed differently.  For instance, gfortran-4.1 uses
# "int4" whereas gfortran-4.3 uses "int(kind=4)".
set int4 "(int4|integer\\(kind=4\\))"
set real4 "(real4|real\\(kind=4\\))"

gdb_test "ptype p" "type = Type bar\r\n *${int4} :: c\r\n *${real4} :: d\r\n *End Type bar"

set test "type-printing for derived type"
gdb_test_multiple "ptype q" $test {
    -re "type = Type foo\r\n *${real4} :: a\r\n *Type bar\r\n *${int4} :: c\r\n *${real4} :: d\r\n *End Type bar :: x\r\n *character\\*7 :: b\r\n *End Type foo\r\n$gdb_prompt $" {
	pass $test
    }
    -re "type = Type foo\r\n *${real4} :: a\r\n *Type bar\r\n *${int4} :: c\r\n *${real4} :: d\r\n *End Type bar :: x\r\n *character :: b\\(7\\)\r\n *End Type foo\r\n$gdb_prompt $" {
	# Compiler should produce string, not an array of characters.
	setup_xfail "*-*-*"
	fail $test
    }
}

gdb_breakpoint [gdb_get_line_number "print"]
gdb_continue_to_breakpoint "print"

gdb_test "print p" "\\$\[0-9\]+ = \\( 1, 2\\.375 \\)"
gdb_test "print p%c" "\\$\[0-9\]+ = 1"
gdb_test "print p%d" "\\$\[0-9\]+ = 2\\.375"
gdb_test "print q%a" "\\$\[0-9\]+ = 3\\.125"

set test "print q%b"
gdb_test_multiple $test $test {
    -re "\\$\[0-9\]+ = 'abcdefg'\r\n$gdb_prompt $" {
	pass $test
    }
    -re "\\$\[0-9\]+ = \\(97 'a', 98 'b', 99 'c', 100 'd', 101 'e', 102 'f', 103 'g'\\)\r\n$gdb_prompt $" {
	# Compiler should produce string, not an array of characters.
	setup_xfail "*-*-*"
	fail $test
    }
}

gdb_test "print q%x%c" "\\$\[0-9\]+ = 1"
gdb_test "print q%x%d" "\\$\[0-9\]+ = 2\\.375"

set test "print q"
gdb_test_multiple $test $test {
    -re "\\$\[0-9\]+ = \\( 3.125, \\( 1, 2\\.375 \\), 'abcdefg' \\)\r\n$gdb_prompt $" {
	pass $test
    }
    -re "\\$\[0-9\]+ = \\( 3.125, \\( 1, 2\\.375 \\), \\(97 'a', 98 'b', 99 'c', 100 'd', 101 'e', 102 'f', 103 'g'\\) \\)\r\n$gdb_prompt $" {
	# Compiler should produce string, not an array of characters.
	setup_xfail "*-*-*"
	fail $test
    }
}
