# Copyright 1998, 1999, 2007, 2008, 2009, 2010, 2011
# 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 all the assignemnt operators
# with mixed types and with int type variables
# 

if $tracelevel then {
	strace $tracelevel
	}

#
# test running programs
#

set testfile "all-types"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
     untested assign.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
}

gdb_test "next" "return 0;" "continuing after dummy()"

gdb_test_multiple "print v_int=57" "v_int=57" {
    -re " = 57.*$gdb_prompt $" {
	gdb_test "print v_int" " = 57" "v_int=57"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6"

gdb_test_multiple "print v_int+=57" "v_int+=57" {
    -re " = 63.*$gdb_prompt $" {
	gdb_test "print v_int" " = 63" "v_int+=57"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (2)"

gdb_test_multiple "print v_int-=57" "v_int-=57" {
    -re " = -51.*$gdb_prompt $" {
	gdb_test "print v_int" " = -51" "v_int-=57"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (3)"

gdb_test_multiple "print v_int*=5" "v_int*=5" {
    -re " = 30.*$gdb_prompt $" {
	gdb_test "print v_int" " = 30" "v_int*=5"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (4)"

gdb_test_multiple "print v_int/=4" "v_int/=4" {
    -re " = 1.*$gdb_prompt $" {
	gdb_test "print v_int" " = 1" "v_int/=4"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (5)"

gdb_test_multiple "print v_int%=4" "v_int%=4" {
    -re " = 2.*$gdb_prompt $" {
	gdb_test "print v_int" " = 2" "v_int%=4"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (6)"

gdb_test_multiple "print v_int+=v_char" "v_int+=char" {
    -re " = 71.*$gdb_prompt $" {
	gdb_test "print v_int" " = 71" "v_int+=char"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (7)"

gdb_test_multiple "print v_int+=v_signed_char" "v_int+=signed_char" {
    -re " = 72.*$gdb_prompt $" {
	gdb_test "print v_int" " = 72" "v_int+=signed_char"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (8)"

gdb_test_multiple "print v_int+=v_unsigned_char" "v_int+=unsigned_char" {
    -re " = 73.*$gdb_prompt $" {
	gdb_test "print v_int" " = 73" "v_int+=unsigned_char"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (9)"

gdb_test_multiple "print v_int+=v_short" "v_int+=short" {
    -re " = 9.*$gdb_prompt $" {
	gdb_test "print v_int" " = 9" "v_int+=short"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (10)"

gdb_test_multiple "print v_int+=v_signed_short" "v_int+=signed_short" {
    -re " = 10.*$gdb_prompt $" {
	gdb_test "print v_int" " = 10" "v_int+=signed_short"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (11)"

gdb_test_multiple "print v_int+=v_unsigned_short" "v_int=+unsigned_short" {
    -re " = 11.*$gdb_prompt $" {
	gdb_test "print v_int" " = 11" "v_int=+unsigned_short"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (12)"

gdb_test_multiple "print v_int+=v_signed_int" "v_int+=signed_int" {
    -re " = 13.*$gdb_prompt $" {
	gdb_test "print v_int" " = 13" "v_int+=signed_int"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (13)"

gdb_test_multiple "print v_int+=v_unsigned_int" "v_int+=unsigned_int" {
    -re " = 14.*$gdb_prompt $" {
	gdb_test "print v_int" " = 14" "v_int+=unsigned_int"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (14)"

gdb_test_multiple "print v_int+=v_long" "v_int+=long" {
    -re " = 15.*$gdb_prompt $" {
	gdb_test "print v_int" " = 15" "v_int+=long"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (15)"

gdb_test_multiple "print v_int+=v_signed_long" "v_int+=signed_long" {
    -re " = 16.*$gdb_prompt $" {
	gdb_test "print v_int" " = 16" "v_int+=signed_long"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (16)"

gdb_test_multiple "print v_int+=v_unsigned_long" "v_int+=unsigned_long" {
    -re " = 17.*$gdb_prompt $" {
	gdb_test "print v_int" " = 17" "v_int+=unsigned_long"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (17)"

gdb_test_multiple "print v_int+=v_float" "v_int+=v_float" {
    -re " = 106.*$gdb_prompt $" {
	gdb_test "print v_int" " = 106" "v_int+=v_float"
    }
}

gdb_test_no_output "set variable v_int = 6" "set v_int to 6 (18)"

gdb_test_multiple "print v_int+=v_double" "v_int+=double" {
    -re " = 206.*$gdb_prompt $" {
	gdb_test "print v_int" " = 206" "v_int+=double"
    }
}
