# Copyright 2011 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 is part of the gdb testsuite.  It contains tests for evaluating
# Fortran subarray expression.

if { [skip_fortran_tests] } { return -1 }

set testfile "multi-dim"
set srcfile ${testfile}.f90
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f90}] } {
    return -1
}

if ![runto MAIN__] {
    perror "Couldn't run to 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\\))"

gdb_breakpoint [gdb_get_line_number "break-static"]
gdb_continue_to_breakpoint "break-static" ".*break-static.*"

gdb_test "print foo(2,3,4)" \
    " = 20" \
    "print valid static array element"

gdb_test "print foo(0,0,0)" \
    "no such vector element" \
    "print an invalid array index (0,0,0)"

gdb_test "print foo(2,3,5)" \
    "no such vector element" \
    "print an invalid array index (2,3,5)"

gdb_test "print foo(2,4,4)" \
    "no such vector element" \
    "print an invalid array index (2,4,4)"

gdb_test "print foo(3,3,4)" \
    "no such vector element" \
    "print an invalid array index (3,3,4)"

gdb_test "print foo" \
    { = \(\( \( 10, 10\) \( 10, 10\) \( 10, 10\) \) \( \( 10, 10\) \( 10, 10\) \( 10, 10\) \) \( \( 10, 10\) \( 10, 10\) \( 10, 10\) \) \( \( 10, 10\) \( 10, 10\) \( 10, 20\) \) \)} \
    "print full contents of the array"

gdb_breakpoint [gdb_get_line_number "break-variable"]
gdb_continue_to_breakpoint "break-variable" ".*break-variable.*"

gdb_test "print varbound(4)" \
    " = 2" \
    "print valid variable bound array element"

gdb_test "ptype unbound" \
    "type = $int4 \\(\\*\\)" \
    "print type of unbound array"

gdb_test "print unbound(4)" \
    " = 2" \
    "print valid unbound array element"
