# Copyright 2020-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/>.

# Places a value with components that have dynamic type into a GDB
# user variable, and then prints the user variable.

standard_testfile ".f90"
load_lib "fortran.exp"

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
    {debug f90 quiet}] } {
    return -1
}

if ![fortran_runto_main] {
    return -1
}

gdb_breakpoint [gdb_get_line_number "Break here"]
gdb_continue_to_breakpoint "Break here"

gdb_test_no_output "set \$a=some_var" "set \$a internal variable"

foreach var { "\$a" "some_var" } {
    with_test_prefix "print $var" {
	gdb_test "print $var" \
	    " = \\( array_one = \\(\\(1, 1\\) \\(1, 1\\) \\(1, 1\\)\\), a_field = 5, array_two = \\(\\(2, 2, 2\\) \\(2, 2, 2\\)\\) \\)" \
	    "print full contents"

	gdb_test "print $var%array_one" \
	    " = \\(\\(1, 1\\) \\(1, 1\\) \\(1, 1\\)\\)" \
	    "print array_one field"

	gdb_test "print $var%a_field" \
	    " = 5" \
	    "print a_field field"

	gdb_test "print $var%array_two" \
	    " = \\(\\(2, 2, 2\\) \\(2, 2, 2\\)\\)" \
	    "print array_two field"
    }
}

# Create new user variables for the fields of some_var, and show that
# modifying these variables does not change the original value from
# the program.
gdb_test_no_output "set \$b = some_var%array_one"
gdb_test_no_output "set \$c = some_var%array_two"
gdb_test "print \$b" \
    " = \\(\\(1, 1\\) \\(1, 1\\) \\(1, 1\\)\\)"
gdb_test "print \$c" \
    " = \\(\\(2, 2, 2\\) \\(2, 2, 2\\)\\)"
gdb_test_no_output "set \$b(2,2) = 3"
gdb_test_no_output "set \$c(3,1) = 4"
gdb_test "print \$b" \
    " = \\(\\(1, 1\\) \\(1, 3\\) \\(1, 1\\)\\)" \
    "print \$b after a change"
gdb_test "print \$c" \
    " = \\(\\(2, 2, 4\\) \\(2, 2, 2\\)\\)" \
    "print \$c after a change"
gdb_test "print some_var%array_one" \
    " = \\(\\(1, 1\\) \\(1, 1\\) \\(1, 1\\)\\)"
gdb_test "print some_var%array_two" \
    " = \\(\\(2, 2, 2\\) \\(2, 2, 2\\)\\)"

# Now modify the user variable '$a', which is a copy of 'some_var',
# and then check how this change is reflected in the original
# 'some_var', and the user variable $a.
#
# When we change 'a_field' which is a non-dynamic field within the
# user variable, the change is only visible within the user variable.
#
# In contrast, when we change 'array_one' and 'array_two', which are
# both fields of dynanic type, then the change is visible in both the
# user variable and the original program variable 'some_var'.  This
# makes sense if you consider the dynamic type as if it was a C
# pointer with automatic indirection.
gdb_test_no_output "set \$a%a_field = 3"
gdb_test_no_output "set \$a%array_one(2,2) = 3"
gdb_test_no_output "set \$a%array_two(3,1) = 4"
gdb_test "print \$a" \
    " = \\( array_one = \\(\\(1, 1\\) \\(1, 3\\) \\(1, 1\\)\\), a_field = 3, array_two = \\(\\(2, 2, 4\\) \\(2, 2, 2\\)\\) \\)"
gdb_test "print some_var" \
    " = \\( array_one = \\(\\(1, 1\\) \\(1, 3\\) \\(1, 1\\)\\), a_field = 5, array_two = \\(\\(2, 2, 4\\) \\(2, 2, 2\\)\\) \\)"
