# Copyright 2019-2020 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 tests GDB's handling of some of the builtin logical and
# arithmetic dot operators in Fortran, for example `.AND.` and `.LE.`.

load_lib "fortran.exp"

if { [skip_fortran_tests] } { continue }

proc test_dot_operations {} {

    foreach_with_prefix format { "uppercase" "lowercase" } {
	if {$format == "uppercase"} {
	    set true ".TRUE."
	    set false ".FALSE."
	    set and ".AND."
	    set or ".OR."
	    set not ".NOT."
	    set eqv ".EQV."
	    set neqv ".NEQV."
	    set eq ".EQ."
	    set ne ".NE."
	    set le ".LE."
	    set ge ".GE."
	    set lt ".LT."
	    set gt ".GT."
	} else {
	    set true ".true."
	    set false ".false."
	    set and ".and."
	    set or ".or."
	    set not ".not."
	    set eqv ".eqv."
	    set neqv ".neqv."
	    set eq ".eq."
	    set ne ".ne."
	    set le ".le."
	    set ge ".ge."
	    set lt ".lt."
	    set gt ".gt."
	}

	# Logical AND
	gdb_test "p $true $and $true" " = .TRUE."
	gdb_test "p $true $and $false" " = .FALSE."
	gdb_test "p $false $and $true" " = .FALSE."
	gdb_test "p $false $and $false" " = .FALSE."

	# Logical OR
	gdb_test "p $true $or $true" " = .TRUE."
	gdb_test "p $true $or $false" " = .TRUE."
	gdb_test "p $false $or $true" " = .TRUE."
	gdb_test "p $false $or $false" " = .FALSE."

	# Logical NOT
	gdb_test "p $not $true" " = .FALSE."
	gdb_test "p $not $false" " = .TRUE."

	# Logical EQV
	gdb_test "p $true $eqv $true" " = .TRUE."
	gdb_test "p $true $eqv $false" " = .FALSE."
	gdb_test "p $false $eqv $true" " = .FALSE."
	gdb_test "p $false $eqv $false" " = .TRUE."

	# Logical NEQV
	gdb_test "p $true $neqv $true" " = .FALSE."
	gdb_test "p $true $neqv $false" " = .TRUE."
	gdb_test "p $false $neqv $true" " = .TRUE."
	gdb_test "p $false $neqv $false" " = .FALSE."

	# Arithmetic EQ
	gdb_test "p 5 $eq 4" " = .FALSE."
	gdb_test "p 4 $eq 4" " = .TRUE."

	# Arithmetic NE
	gdb_test "p 5 $ne 4" " = .TRUE."
	gdb_test "p 4 $ne 4" " = .FALSE."

	# Arithmetic LE
	gdb_test "p 5 $le 4" " = .FALSE."
	gdb_test "p 4 $le 4" " = .TRUE."
	gdb_test "p 3 $le 4" " = .TRUE."

	# Arithmetic LT
	gdb_test "p 5 $lt 4" " = .FALSE."
	gdb_test "p 4 $lt 4" " = .FALSE."
	gdb_test "p 3 $lt 4" " = .TRUE."

	# Arithmetic GE
	gdb_test "p 5 $ge 4" " = .TRUE."
	gdb_test "p 4 $ge 4" " = .TRUE."
	gdb_test "p 3 $ge 4" " = .FALSE."

	# Arithmetic GT
	gdb_test "p 5 $gt 4" " = .TRUE."
	gdb_test "p 4 $gt 4" " = .FALSE."
	gdb_test "p 3 $gt 4" " = .FALSE."
    }
}

# Start of test script.

clean_restart

if [set_lang_fortran] then {
    test_dot_operations
} else {
    warning "$test_name tests suppressed." 0
}

