# Copyright 2005, 2007, 2008 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 evaluating
# Fortran subarray expression.

if $tracelevel then {
	strace $tracelevel
}

set testfile "subarray"
set srcfile ${testfile}.f
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
    untested "Couldn't compile ${srcfile}"
    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
}

# Try to set breakpoint at the last write statement.

set bp_location [gdb_get_line_number "str(:)"]
gdb_test "break $bp_location" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \
    "breakpoint at the last write statement"
gdb_test "continue" \
    "Continuing\\..*Breakpoint.*" \
    "continue to breakpoint"

# Test four different kinds of subarray expression evaluation.

gdb_test "print str(2:4)" ".*1 = \\(98 'b', 99 'c', 100 'd'\\).*" "print str(2:4)"
gdb_test "print str(:3)" ".*2 = \\(97 'a', 98 'b', 99 'c'\\).*" "print str(:3)"
gdb_test "print str(5:)" ".*3 = \\(101 'e', 102 'f', 103 'g'\\).*" "print str(5:)"
gdb_test "print str(:)" ".*4 = \\(97 'a', 98 'b', 99 'c', 100 'd', 101 'e', 102 'f', 103 'g'\\).*" "print str(:)"

gdb_test "print array(2:4)" ".*5 = \\(2, 3, 4\\).*" "print array(2:4)"
gdb_test "print array(:3)" ".*6 = \\(1, 2, 3\\).*" "print array(:3)"
gdb_test "print array(5:)" ".*7 = \\(5, 6, 7\\).*" "print array(5:)"
gdb_test "print array(:)" ".*8 = \\(1, 2, 3, 4, 5, 6, 7\\).*" "print array(:)"

