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

# 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 xor ".XOR."
	    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 xor ".xor."
	    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."

	# And the legacy alias for NEQV, XOR
	gdb_test "p $true $xor $true" " = .FALSE."
	gdb_test "p $true $xor $false" " = .TRUE."
	gdb_test "p $false $xor $true" " = .TRUE."
	gdb_test "p $false $xor $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."
    }

    # Now test the symbol based comparison operators.

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

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

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

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

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

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

# Start of test script.

clean_restart

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

