# 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)

# 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.

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

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

if [get_compiler_info] {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}


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

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"

gdb_test "print (0 && (x+y))" ".$decimal = $false" \
    "print value of (0 && (x+y))"

gdb_test "print (0 && (x-y))" ".$decimal = $false" \
    "print value of (0 && (x-y))"

gdb_test "print (0 && (x*y))" ".$decimal = $false" \
    "print value of (0 && (x*y))"

gdb_test "print (0 && (x/y))" ".$decimal = $false" \
    "print value of (0 && (x/y))"

gdb_test "print (0 && (x%y))" ".$decimal = $false" \
    "print value of (0 && (x%y))"

gdb_test "print (0 && (x&&y))" ".$decimal = $false" \
    "print value of (0 && (x&&y))"

gdb_test "print (0 && (x||y))" ".$decimal = $false" \
    "print value of (0 && (x||y))"

gdb_test "print (0 && (x&y))" ".$decimal = $false" \
    "print value of (0 && (x&y))"

gdb_test "print (0 && (x|y))" ".$decimal = $false" \
    "print value of (0 && (x|y))"

gdb_test "print (0 && (x^y))" ".$decimal = $false" \
    "print value of (0 && (x^y))"

gdb_test "print (0 && (x < y))" ".$decimal = $false" \
    "print value of (0 && (x < y))"

gdb_test "print (0 && (x <= y))" ".$decimal = $false" \
    "print value of (0 && (x <= y))"

gdb_test "print (0 && (x>y))" ".$decimal = $false" \
    "print value of (0 && (x>y))"

gdb_test "print (0 && (x>=y))" ".$decimal = $false" \
    "print value of (0 && (x>=y))"

gdb_test "print (0 && (x==y))" ".$decimal = $false" \
    "print value of (0 && (x==y))"

gdb_test "print (0 && (x!=y))" ".$decimal = $false" \
    "print value of (0 && (x!=y))"

gdb_test "print (0 && (x<<31))" ".$decimal = $false" \
    "print value of (0 && (x<<31))"

gdb_test "print (0 && (x>>31))" ".$decimal = $false" \
    "print value of (0 && (x>>31))"

gdb_test "print (0 && (!x))" ".$decimal = $false" \
    "print value of (0 && (!x))"

gdb_test "print (0 && (~x))" ".$decimal = $false" \
    "print value of (0 && (~x))"

gdb_test "print (0 && (-x))" ".$decimal = $false" \
    "print value of (0 && (-x))"

gdb_test "print (0 && (x++))" ".$decimal = $false" \
    "print value of (0 && (x++))"

gdb_test "print (0 && (++x))" ".$decimal = $false" \
    "print value of (0 && (++x))"

gdb_test "print (0 && (x--))" ".$decimal = $false" \
    "print value of (0 && (x--))"

gdb_test "print (0 && (--x))" ".$decimal = $false" \
    "print value of (0 && (--x))"

gdb_test "print (0 && (x+=7))" ".$decimal = $false" \
    "print value of (0 && (x+=7))"

gdb_test "print (0 && (x=y))" ".$decimal = $false" \
    "print value of (0 && (x=y))"


gdb_exit
return 0







