# Note: we're using (-9223372036854775807:::int8 - 1) in several places to get
# math.MinInt64 value.

#####################
# Integer addition. #
#####################

eval
1 + 9223372036854775807:::int8
----
integer out of range

eval
-1 + (-9223372036854775807:::int8 - 1)
----
integer out of range

eval
9223372036854775807:::int8 + 1
----
integer out of range

eval
(-9223372036854775807:::int8 - 1) + -1
----
integer out of range

eval
1 + 9223372036854775806:::int8
----
9223372036854775807

eval
-1 + -9223372036854775807:::int8
----
-9223372036854775808

eval
9223372036854775806:::int8 + 1
----
9223372036854775807

eval
-9223372036854775807:::int8 + 1
----
-9223372036854775806

########################
# Integer subtraction. #
########################

eval
1 - -9223372036854775807:::int8
----
integer out of range

eval
-2 - 9223372036854775807:::int8
----
integer out of range

eval
9223372036854775807:::int8 - -1
----
integer out of range

eval
(-9223372036854775807:::int8 - 1) - 1
----
integer out of range

eval
1 - (-9223372036854775807:::int8 + 1)
----
9223372036854775807

eval
-1 - 9223372036854775807:::int8
----
-9223372036854775808

eval
-1 - -9223372036854775807:::int8
----
9223372036854775806

eval
0 - 9223372036854775807:::int8
----
-9223372036854775807

###########################
# Integer multiplication. #
###########################

eval
32766:::int2 * 100:::int2
----
3276600

eval
-32767:::int2 * 100:::int2
----
-3276700

eval
2147483646:::int4 * 100:::int4
----
214748364600

eval
-2147483647:::int4 * 100:::int4
----
-214748364700

eval
9223372036854775806:::int8 * 100:::int8
----
integer out of range

eval
-9223372036854775807:::int8 * 100:::int8
----
integer out of range

eval
-32767:::int2 * -1:::int2
----
32767

eval
-32768:::int2 * -1:::int2
----
integer out of range for type int2

eval
-2147483647:::int4 * -1:::int4
----
2147483647

eval
-2147483648:::int4 * -1:::int4
----
integer out of range for type int4

eval
(-9223372036854775807:::int8 - 1) * -1:::int8
----
integer out of range

eval
32767:::int2 * -1:::int2
----
-32767

eval
2147483647:::int4 * -1:::int4
----
-2147483647

eval
9223372036854775807:::int8 * -1:::int8
----
-9223372036854775807

eval
32767:::int2 * 0:::int2
----
0

eval
2147483647:::int4 * 0:::int4
----
0

eval
9223372036854775807:::int8 * 0:::int8
----
0

#####################
# Integer division. #
#####################

eval
-32767:::int2 / -1:::int2
----
32767.000000000000000

eval
-32768:::int2 / -1:::int2
----
integer out of range for type int2

eval
-2147483647:::int4 / -1:::int4
----
2147483647.0000000000

eval
-2147483648:::int4 / -1:::int4
----
integer out of range for type int4

eval
(-9223372036854775807:::int8 - 1) / -1:::int8
----
9223372036854775808.0

eval
10:::int2 / 0:::int2
----
division by zero

eval
10:::int4 / 0:::int4
----
division by zero

eval
10:::int8 / 0:::int8
----
division by zero

eval
32767:::int2 / -1:::int2
----
-32767.000000000000000

eval
2147483647:::int4 / -1:::int4
----
-2147483647.0000000000

eval
9223372036854775807:::int8 / -1:::int8
----
-9223372036854775807.0

##################################
# Mixed-type integer arithmetic. #
##################################

eval
10:::int2 + 12:::int4
----
22

eval
-10:::int2 + -12:::int8
----
-22

eval
-10:::int8 + 12:::int4
----
2

eval
10:::int8 + -12:::int2
----
-2

eval
10:::int2 - 12:::int4
----
-2

eval
-10:::int2 - -12:::int8
----
2

eval
-10:::int8 - 12:::int4
----
-22

eval
10:::int8 - -12:::int2
----
22

eval
10:::int2 * 12:::int4
----
120

eval
-10:::int2 * -12:::int8
----
120

eval
-10:::int8 * 12:::int4
----
-120

eval
10:::int8 * -12:::int2
----
-120

eval
4:::int2 / 2:::int4
----
2.0000000000000000000

eval
6:::int2 / 2:::int8
----
3.0000000000000000000

eval
12:::int8 / 3:::int4
----
4.0000000000000000000

eval
20:::int8 / 4:::int4
----
5.0000000000000000000
