# This testcase is part of GDB, the GNU debugger.

# Copyright 1998-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 was written by Elena Zannoni (ezannoni@cygnus.com)

# Tests for correctenss of logical operators, associativity and
# precedence with integer type variables


#
# test running programs
#

standard_testfile int-type.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested "failed to compile"
    return -1
}

if [get_compiler_info] {
    return -1
}

clean_restart ${binfile}


#
# set it up at a breakpoint so we can play with the variable values
#

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

proc evaluate { vars ops } {
    for {set vari 0} {$vari < [llength $vars]} {incr vari} {
	set var [lindex $vars $vari]
	for {set opi 0} {$opi < [llength $ops]} {incr opi} {
	    set op [lindex [lindex $ops $opi] 0]
	    set val [lindex [lindex $ops $opi] [expr $vari + 1]]
	    gdb_test "print $var, $op" " = $val" "evaluate $op; variables $var; expecting $val"
	}
    }
}

# Unary

evaluate {
    {x = 0} {x = 1}
} {
    { {x}   0 1 }
    { {!x}  1 0 }
    { {!!x} 0 1 }
}

# Binary (with unary)

evaluate {
    {x = 0, y = 0} {x = 0, y = 1} {x = 1, y = 0} {x = 1, y = 1}
} {
    { {x && y}   0 0 0 1 }
    { {!x && y}  0 1 0 0 }
    { {x && !y}  0 0 1 0 }
    { {!x && !y} 1 0 0 0 }

    { {x || y}   0 1 1 1 }
    { {!x || y}  1 1 0 1 }
    { {x || !y}  1 0 1 1 }
    { {!x || !y} 1 1 1 0 }

    { {x < y}    0 1 0 0 }
    { {x <= y}   1 1 0 1 }
    { {x == y}   1 0 0 1 }
    { {x != y}   0 1 1 0 }
    { {x >= y}   1 0 1 1 }
    { {x > y}    0 0 1 0 }
}

# Full table of &&, || combinations, followed by random mix of unary ops

evaluate {
    {x = 0, y = 0, z = 0} {x = 0, y = 0, z = 1} {x = 0, y = 1, z = 0} {x = 0, y = 1, z = 1}
    {x = 1, y = 0, z = 0} {x = 1, y = 0, z = 1} {x = 1, y = 1, z = 0} {x = 1, y = 1, z = 1}
} {
    { {x && y && z}    0 0 0 0  0 0 0 1 }
    { {x || y && z}    0 0 0 1  1 1 1 1 }
    { {x && y || z}    0 1 0 1  0 1 1 1 }
    { {x || y || z}    0 1 1 1  1 1 1 1 }

    { {x || !y && z}   0 1 0 0  1 1 1 1 }
    { {!x || y && z}   1 1 1 1  0 0 0 1 }
    { {!x || y && !z}  1 1 1 1  0 0 1 0 }
}

# More complex operations

evaluate {
    {x = 1, y = 2, w = 3, z = 3}
    {x = 1, y = 2, w = 1, z = 3}
    {x = 2, y = 2, w = 2, z = 3}
} {
    { {x > y || w == z}   1 0 0 }
    { {x >= y && w != z}  0 0 1 }
    { {! x > y || w + z}  1 1 1 }
}
