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

# Copyright 1998-2013 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
#

set testfile "int-type"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested logical.exp
    return -1
}

if [get_compiler_info] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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 }
}
