# Copyright 1998, 1999, 2007, 2008, 2009 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 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

if { [prepare_for_testing whatis-exp.exp whatis-exp int-type.c {debug nowarnings}] } {
    return -1
}

#
# 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 = 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/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
