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

# This file is part of the gdb testsuite

#
# test of evaluation of conditional expressions, with constants and 
# variables. Using the print and the whatis command
# written with the only purpose in mind to cover the holes in the
# eval.c file
#
# 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 ${binfile}


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

gdb_test "print (2 ? 3 : 4)" "\[0-9\]* = 3" \
    "print value of cond expr (const true)"

gdb_test "print (0 ? 3 : 4)" "\[0-9\]* = 4" \
    "print value of cond expr (const false)"

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=3" "set variable z=3"

gdb_test "print (x ? y : z)" "\[0-9\]* = 2" \
    "print value of cond expr (var true)"

gdb_test_no_output "set variable x=0" "set variable x=0"

gdb_test "print (x ? y : z)" "\[0-9\]* = 3" \
    "print value of cond expr (var false)"

gdb_test "whatis (0 ? 3 : 4)" "type = int" \
    "print whatis of cond expr"











