# Copyright 1998-2025 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)

# This file is part of the gdb testsuite

#
# tests to cover evaluate_subexp_standard with the EVAL_SKIP flag set.
# this happens for instance when there is short circuit evaluation in the && and ||
# operators, or in the non returned part of a (x ? y: z) expression.
# the part that is not evaluated is parsed and evaluated anyway, but with
# the EVAL_SKIP flag set
# 
# source file "int-type.c"
#


# Check to see if we have an executable to test.  If not, then either we
# haven't tried to compile one, or the compilation failed for some reason.
# In either case, just notify the user and skip the tests in this file.

standard_testfile int-type.c

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

clean_restart
gdb_load $binfile


if {![runto_main]} {
    return
}

# This is used as an expected result value.
set false 0

gdb_test_no_output "set variable x=14" "set variable x=14"
gdb_test_no_output "set variable y=2" "set variable y=2"
gdb_test_no_output "set variable z=2" "set variable z=2"
gdb_test_no_output "set variable w=3" "set variable w=3"

proc test { val re } {
    gdb_test "print $val" $re "print value of $val value"
}

test "(0 && (x+y))" ".$decimal = $false"

test "(0 && (x-y))" ".$decimal = $false"

test "(0 && (x*y))" ".$decimal = $false"

test "(0 && (x/y))" ".$decimal = $false"

test "(0 && (x%y))" ".$decimal = $false"

test "(0 && (x&&y))" ".$decimal = $false"

test "(0 && (x||y))" ".$decimal = $false"

test "(0 && (x&y))" ".$decimal = $false"

test "(0 && (x|y))" ".$decimal = $false"

test "(0 && (x^y))" ".$decimal = $false"

test "(0 && (x < y))" ".$decimal = $false"

test "(0 && (x <= y))" ".$decimal = $false"

test "(0 && (x>y))" ".$decimal = $false"

test "(0 && (x>=y))" ".$decimal = $false"

test "(0 && (x==y))" ".$decimal = $false"

test "(0 && (x!=y))" ".$decimal = $false"

test "(0 && (x<<31))" ".$decimal = $false"

test "(0 && (x>>31))" ".$decimal = $false"

test "(0 && (!x))" ".$decimal = $false"

test "(0 && (~x))" ".$decimal = $false"

test "(0 && (-x))" ".$decimal = $false"

test "(0 && (x++))" ".$decimal = $false"

test "(0 && (++x))" ".$decimal = $false"

test "(0 && (x--))" ".$decimal = $false"

test "(0 && (--x))" ".$decimal = $false"

test "(0 && (x+=7))" ".$decimal = $false"

test "(0 && (x=y))" ".$decimal = $false"


gdb_exit
