# Copyright 1998, 1999 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Elena Zannoni (ezannoni@cygnus.com)

# This file is part of the gdb testsuite
#
# tests for whatis command on expressions.
# used in file eval.c. This flavor of whatis
# command performs evaluation of expressions w/o actually
# computing the value, but just the type
# of the result. It goes through the evaluate_subexp_standard
# with the EVAL_AVOID_SIDE_EFFECTS flag rather than EVAL_NORMAL
# 

if $tracelevel then {
	strace $tracelevel
	}

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile "int-type"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }


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
}

#
# test expressions with "int" types
#

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

send_gdb "print x\n"
gdb_expect {
    -re ".*14.*$gdb_prompt $" {
        pass "print value of x"
      }
    -re ".*$gdb_prompt $" { fail "print value of x" }
    timeout           { fail "(timeout) print value of x" }    
  }


send_gdb "print y\n"
gdb_expect {
    -re ".*2.*$gdb_prompt $" {
        pass "print value of y"
      }
    -re ".*$gdb_prompt $" { fail "print value of y" }
    timeout           { fail "(timeout) print value of y" }    
  }

send_gdb "print z\n"
gdb_expect {
    -re ".*2.*$gdb_prompt $" {
        pass "print value of z"
      }
    -re ".*$gdb_prompt $" { fail "print value of z" }
    timeout           { fail "(timeout) print value of z" }    
  }

send_gdb "print w\n"
gdb_expect {
    -re ".*3.*$gdb_prompt $" {
        pass "print value of w"
      }
    -re ".*$gdb_prompt $" { fail "print value of w" }
    timeout           { fail "(timeout) print value of w" }    
  }



send_gdb "whatis x+y\n"
gdb_expect {
    -re ".*type = long.*$gdb_prompt $" {
        pass "whatis value of x+y"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x+y" }
    timeout           { fail "(timeout) whatis value of x+y" }    
  }

send_gdb "whatis x-y\n"
gdb_expect {
    -re ".*type = long.*$gdb_prompt $" {
        pass "whatis value of x-y"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x-y" }
    timeout           { fail "(timeout) whatis value of x-y" }    
  }

send_gdb "whatis x*y\n"
gdb_expect {
    -re ".*type = long.*$gdb_prompt $" {
        pass "whatis value of x*y"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x*y" }
    timeout           { fail "(timeout) whatis value of x*y" }    
  }

send_gdb "whatis x/y\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of x/y"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x/y" }
    timeout           { fail "(timeout) whatis value of x/y" }    
  }

send_gdb "whatis x%y\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of x%y"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x%y" }
    timeout           { fail "(timeout) whatis value of x%y" }    
  }



send_gdb "whatis x=y\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of x=y"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x=y" }
    timeout           { fail "(timeout) whatis value of x=y" }
  }


send_gdb "whatis x+=2\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of x+=2"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x+=2" }
    timeout           { fail "(timeout) whatis value of x+=2" }
  }


send_gdb "whatis ++x\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of ++x"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of ++x" }
    timeout           { fail "(timeout) whatis value of ++x" }
  }

send_gdb "whatis --x\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of --x"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of --x" }
    timeout           { fail "(timeout) whatis value of --x" }
  }

send_gdb "whatis x++\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of x++"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x++" }
    timeout           { fail "(timeout) whatis value of x++" }
  }

send_gdb "whatis x--\n"
gdb_expect {
    -re ".*type = int.*$gdb_prompt $" {
        pass "whatis value of x--"
      }
    -re ".*$gdb_prompt $" { fail "whatis value of x--" }
    timeout           { fail "(timeout) whatis value of x--" }
  }

gdb_exit
return 0
