# 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 nowarnings}] != "" } {
     untested whatis-exp.exp
     return -1
    }


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
