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

# Testing GDB's implementation of ASSOCIATED keyword.

if {[skip_fortran_tests]} { return -1 }

standard_testfile ".f90"
load_lib fortran.exp

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

if ![fortran_runto_main] {
    untested "could not run to main"
    return -1
}

gdb_breakpoint [gdb_get_line_number "Test Breakpoint"]
gdb_breakpoint [gdb_get_line_number "Final Breakpoint"]

# We place a limit on the number of tests that can be run, just in
# case something goes wrong, and GDB gets stuck in an loop here.
set found_final_breakpoint false
set test_count 0
while { $test_count < 500 } {
    with_test_prefix "test $test_count" {
	incr test_count

	gdb_test_multiple "continue" "continue" {
	    -re -wrap "! Test Breakpoint" {
		# We can run a test from here.
	    }
	    -re -wrap "! Final Breakpoint" {
		# We're done with the tests.
		set found_final_breakpoint true
	    }
	}

	if ($found_final_breakpoint) {
	    break
	}

	# First grab the expected answer.
	set answer [get_valueof "" "answer" "**unknown**"]

	# Now move up a frame and figure out a command for us to run
	# as a test.
	set command ""
	gdb_test_multiple "up" "up" {
	    -re -wrap "\r\n\[0-9\]+\[ \t\]+call test_associated \\((\[^\r\n\]+)\\)" {
		set command $expect_out(1,string)
	    }
	}

	gdb_assert { ![string equal $command ""] } "found a command to run"

	gdb_test "p $command" " = $answer"
    }
}

# Ensure we reached the final breakpoint.  If more tests have been added
# to the test script, and this starts failing, then the safety 'while'
# loop above might need to be increased.
gdb_assert {$found_final_breakpoint} "ran all compiled in tests"

# Now perform the final tests.  These should all be error condition
# checks, for things that can't be compiled into the test source file.
gdb_test "p associated (array_1d_p, an_integer)" \
    "arguments to associated must be of same type and kind"

gdb_test "p associated (an_integer_p, a_real)" \
    "arguments to associated must be of same type and kind"
