summaryrefslogtreecommitdiffstats
path: root/tests/expr.test
diff options
context:
space:
mode:
authormdejong <mdejong>2005-07-09 00:27:25 (GMT)
committermdejong <mdejong>2005-07-09 00:27:25 (GMT)
commiteef683116916bd916b5d804a98110b9e7139dcc2 (patch)
treeacabb9156822cf78785eb37708fce262e826f50d /tests/expr.test
parent199c02aeae93a951a592d2c5f1a9b336a891cc21 (diff)
downloadtcl-eef683116916bd916b5d804a98110b9e7139dcc2.zip
tcl-eef683116916bd916b5d804a98110b9e7139dcc2.tar.gz
tcl-eef683116916bd916b5d804a98110b9e7139dcc2.tar.bz2
* generic/tclExecute.c (TclExecuteByteCode):
Reimplement long and wide type integer division and modulus operations so that the smallest and largest integer values are handled properly. The divide operation is more efficient since it no longer does a modulus or negation and only checks for a remainder when the quotient will be a negative number. The modulus operation is now a bit more complex because of a number of special cases dealing with the smallest and largest integers. * tests/expr.test: Add test cases for division and modulus operations on the smallest and largest integer values for 32 and 64 bit types. [Patch 1230205]
Diffstat (limited to 'tests/expr.test')
-rw-r--r--tests/expr.test970
1 files changed, 969 insertions, 1 deletions
diff --git a/tests/expr.test b/tests/expr.test
index a7ea152..781eb8e 100644
--- a/tests/expr.test
+++ b/tests/expr.test
@@ -10,7 +10,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: expr.test,v 1.34 2005/06/29 03:29:02 mdejong Exp $
+# RCS: @(#) $Id: expr.test,v 1.35 2005/07/09 00:27:33 mdejong Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest 2.1
@@ -5495,10 +5495,978 @@ test expr-33.4 {parse smallest wide value} {wideis64bit} {
} {-9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 1 1}
+set min -2147483648
+set max 2147483647
+
+test expr-34.1 {expr edge cases} {longis32bit} {
+ expr {$min / $min}
+} {1}
+
+test expr-34.2 {expr edge cases} {longis32bit} {
+ expr {$min % $min}
+} {0}
+
+test expr-34.3 {expr edge cases} {longis32bit} {
+ expr {$min / ($min + 1)}
+} {1}
+
+test expr-34.4 {expr edge cases} {longis32bit} {
+ expr {$min % ($min + 1)}
+} {-1}
+
+test expr-34.5 {expr edge cases} {longis32bit} {
+ expr {$min / ($min + 2)}
+} {1}
+
+test expr-34.6 {expr edge cases} {longis32bit} {
+ expr {$min % ($min + 2)}
+} {-2}
+
+test expr-34.7 {expr edge cases} {longis32bit} {
+ expr {$min / ($min + 3)}
+} {1}
+
+test expr-34.8 {expr edge cases} {longis32bit} {
+ expr {$min % ($min + 3)}
+} {-3}
+
+test expr-34.9 {expr edge cases} {longis32bit} {
+ expr {$min / -3}
+} {715827882}
+
+test expr-34.10 {expr edge cases} {longis32bit} {
+ expr {$min % -3}
+} {-2}
+
+test expr-34.11 {expr edge cases} {longis32bit} {
+ expr {$min / -2}
+} {1073741824}
+
+test expr-34.12 {expr edge cases} {longis32bit} {
+ expr {$min % -2}
+} {0}
+
+test expr-34.13 {expr edge cases} {longis32bit} {
+ expr {$min / -1}
+} {-2147483648}
+
+test expr-34.14 {expr edge cases} {longis32bit} {
+ expr {$min % -1}
+} {0}
+
+test expr-34.15 {expr edge cases} {longis32bit} {
+ expr {$min * -1}
+} $min
+
+test expr-34.16 {expr edge cases} {longis32bit} {
+ expr {-$min}
+} $min
+
+test expr-34.17 {expr edge cases} {longis32bit} {
+ expr {$min / 1}
+} $min
+
+test expr-34.18 {expr edge cases} {longis32bit} {
+ expr {$min % 1}
+} {0}
+
+test expr-34.19 {expr edge cases} {longis32bit} {
+ expr {$min / 2}
+} {-1073741824}
+
+test expr-34.20 {expr edge cases} {longis32bit} {
+ expr {$min % 2}
+} {0}
+
+test expr-34.21 {expr edge cases} {longis32bit} {
+ expr {$min / 3}
+} {-715827883}
+
+test expr-34.22 {expr edge cases} {longis32bit} {
+ expr {$min % 3}
+} {1}
+
+test expr-34.23 {expr edge cases} {longis32bit} {
+ expr {$min / ($max - 3)}
+} {-2}
+
+test expr-34.24 {expr edge cases} {longis32bit} {
+ expr {$min % ($max - 3)}
+} {2147483640}
+
+test expr-34.25 {expr edge cases} {longis32bit} {
+ expr {$min / ($max - 2)}
+} {-2}
+
+test expr-34.26 {expr edge cases} {longis32bit} {
+ expr {$min % ($max - 2)}
+} {2147483642}
+
+test expr-34.27 {expr edge cases} {longis32bit} {
+ expr {$min / ($max - 1)}
+} {-2}
+
+test expr-34.28 {expr edge cases} {longis32bit} {
+ expr {$min % ($max - 1)}
+} {2147483644}
+
+test expr-34.29 {expr edge cases} {longis32bit} {
+ expr {$min / $max}
+} {-2}
+
+test expr-34.30 {expr edge cases} {longis32bit} {
+ expr {$min % $max}
+} {2147483646}
+
+test expr-34.31 {expr edge cases} {longis32bit} {
+ expr {$max / $max}
+} {1}
+
+test expr-34.32 {expr edge cases} {longis32bit} {
+ expr {$max % $max}
+} {0}
+
+test expr-34.33 {expr edge cases} {longis32bit} {
+ expr {$max / ($max - 1)}
+} {1}
+
+test expr-34.34 {expr edge cases} {longis32bit} {
+ expr {$max % ($max - 1)}
+} {1}
+
+test expr-34.35 {expr edge cases} {longis32bit} {
+ expr {$max / ($max - 2)}
+} {1}
+
+test expr-34.36 {expr edge cases} {longis32bit} {
+ expr {$max % ($max - 2)}
+} {2}
+
+test expr-34.37 {expr edge cases} {longis32bit} {
+ expr {$max / ($max - 3)}
+} {1}
+
+test expr-34.38 {expr edge cases} {longis32bit} {
+ expr {$max % ($max - 3)}
+} {3}
+
+test expr-34.39 {expr edge cases} {longis32bit} {
+ expr {$max / 3}
+} {715827882}
+
+test expr-34.40 {expr edge cases} {longis32bit} {
+ expr {$max % 3}
+} {1}
+
+test expr-34.41 {expr edge cases} {longis32bit} {
+ expr {$max / 2}
+} {1073741823}
+
+test expr-34.42 {expr edge cases} {longis32bit} {
+ expr {$max % 2}
+} {1}
+
+test expr-34.43 {expr edge cases} {longis32bit} {
+ expr {$max / 1}
+} $max
+
+test expr-34.44 {expr edge cases} {longis32bit} {
+ expr {$max % 1}
+} {0}
+
+test expr-34.45 {expr edge cases} {longis32bit} {
+ expr {$max / -1}
+} "-$max"
+
+test expr-34.46 {expr edge cases} {longis32bit} {
+ expr {$max % -1}
+} {0}
+
+test expr-34.47 {expr edge cases} {longis32bit} {
+ expr {$max / -2}
+} {-1073741824}
+
+test expr-34.48 {expr edge cases} {longis32bit} {
+ expr {$max % -2}
+} {-1}
+
+test expr-34.49 {expr edge cases} {longis32bit} {
+ expr {$max / -3}
+} {-715827883}
+
+test expr-34.50 {expr edge cases} {longis32bit} {
+ expr {$max % -3}
+} {-2}
+
+test expr-34.51 {expr edge cases} {longis32bit} {
+ expr {$max / ($min + 3)}
+} {-2}
+
+test expr-34.52 {expr edge cases} {longis32bit} {
+ expr {$max % ($min + 3)}
+} {-2147483643}
+
+test expr-34.53 {expr edge cases} {longis32bit} {
+ expr {$max / ($min + 2)}
+} {-2}
+
+test expr-34.54 {expr edge cases} {longis32bit} {
+ expr {$max % ($min + 2)}
+} {-2147483645}
+
+test expr-34.55 {expr edge cases} {longis32bit} {
+ expr {$max / ($min + 1)}
+} {-1}
+
+test expr-34.56 {expr edge cases} {longis32bit} {
+ expr {$max % ($min + 1)}
+} {0}
+
+test expr-34.57 {expr edge cases} {longis32bit} {
+ expr {$max / $min}
+} {-1}
+
+test expr-34.58 {expr edge cases} {longis32bit} {
+ expr {$max % $min}
+} {-1}
+
+test expr-34.59 {expr edge cases} {longis32bit} {
+ expr {($min + 1) / ($max - 1)}
+} {-2}
+
+test expr-34.60 {expr edge cases} {longis32bit} {
+ expr {($min + 1) % ($max - 1)}
+} {2147483645}
+
+test expr-34.61 {expr edge cases} {longis32bit} {
+ expr {($max - 1) / ($min + 1)}
+} {-1}
+
+test expr-34.62 {expr edge cases} {longis32bit} {
+ expr {($max - 1) % ($min + 1)}
+} {-1}
+
+test expr-34.63 {expr edge cases} {longis32bit} {
+ expr {($max - 1) / $min}
+} {-1}
+
+test expr-34.64 {expr edge cases} {longis32bit} {
+ expr {($max - 1) % $min}
+} {-2}
+
+test expr-34.65 {expr edge cases} {longis32bit} {
+ expr {($max - 2) / $min}
+} {-1}
+
+test expr-34.66 {expr edge cases} {longis32bit} {
+ expr {($max - 2) % $min}
+} {-3}
+
+test expr-34.67 {expr edge cases} {longis32bit} {
+ expr {($max - 3) / $min}
+} {-1}
+
+test expr-34.68 {expr edge cases} {longis32bit} {
+ expr {($max - 3) % $min}
+} {-4}
+
+test expr-34.69 {expr edge cases} {longis32bit} {
+ expr {-3 / $min}
+} {0}
+
+test expr-34.70 {expr edge cases} {longis32bit} {
+ expr {-3 % $min}
+} {-3}
+
+test expr-34.71 {expr edge cases} {longis32bit} {
+ expr {-2 / $min}
+} {0}
+
+test expr-34.72 {expr edge cases} {longis32bit} {
+ expr {-2 % $min}
+} {-2}
+
+test expr-34.73 {expr edge cases} {longis32bit} {
+ expr {-1 / $min}
+} {0}
+
+test expr-34.74 {expr edge cases} {longis32bit} {
+ expr {-1 % $min}
+} {-1}
+
+test expr-34.75 {expr edge cases} {longis32bit} {
+ expr {0 / $min}
+} {0}
+
+test expr-34.76 {expr edge cases} {longis32bit} {
+ expr {0 % $min}
+} {0}
+
+test expr-34.77 {expr edge cases} {longis32bit} {
+ expr {0 / ($min + 1)}
+} {0}
+
+test expr-34.78 {expr edge cases} {longis32bit} {
+ expr {0 % ($min + 1)}
+} {0}
+
+test expr-34.79 {expr edge cases} {longis32bit} {
+ expr {1 / $min}
+} {-1}
+
+test expr-34.80 {expr edge cases} {longis32bit} {
+ expr {1 % $min}
+} {-2147483647}
+
+test expr-34.81 {expr edge cases} {longis32bit} {
+ expr {1 / ($min + 1)}
+} {-1}
+
+test expr-34.82 {expr edge cases} {longis32bit} {
+ expr {1 % ($min + 1)}
+} {-2147483646}
+
+test expr-34.83 {expr edge cases} {longis32bit} {
+ expr {2 / $min}
+} {-1}
+
+test expr-34.84 {expr edge cases} {longis32bit} {
+ expr {2 % $min}
+} {-2147483646}
+
+test expr-34.85 {expr edge cases} {longis32bit} {
+ expr {2 / ($min + 1)}
+} {-1}
+
+test expr-34.86 {expr edge cases} {longis32bit} {
+ expr {2 % ($min + 1)}
+} {-2147483645}
+
+test expr-34.87 {expr edge cases} {longis32bit} {
+ expr {3 / $min}
+} {-1}
+
+test expr-34.88 {expr edge cases} {longis32bit} {
+ expr {3 % $min}
+} {-2147483645}
+
+test expr-34.89 {expr edge cases} {longis32bit} {
+ expr {3 / ($min + 1)}
+} {-1}
+
+test expr-34.90 {expr edge cases} {longis32bit} {
+ expr {3 % ($min + 1)}
+} {-2147483644}
+
+# Euclidean property:
+# quotient * divisor + remainder = dividend
+
+test expr-35.1 {expr edge cases} {longis32bit} {
+ set dividend $max
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($divisor * $q) + $r}]
+} {1073741823 * 2 + 1 = 2147483647}
+
+test expr-35.2 {expr edge cases} {longis32bit} {
+ set dividend [expr {$max - 1}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1073741823 * 2 + 0 = 2147483646}
+
+test expr-35.3 {expr edge cases} {longis32bit} {
+ set dividend [expr {$max - 2}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1073741822 * 2 + 1 = 2147483645}
+
+test expr-35.4 {expr edge cases} {longis32bit} {
+ set dividend $max
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {715827882 * 3 + 1 = 2147483647}
+
+test expr-35.5 {expr edge cases} {longis32bit} {
+ set dividend [expr {$max - 1}]
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {715827882 * 3 + 0 = 2147483646}
+
+test expr-35.6 {expr edge cases} {longis32bit} {
+ set dividend [expr {$max - 2}]
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {715827881 * 3 + 2 = 2147483645}
+
+test expr-35.7 {expr edge cases} {longis32bit} {
+ set dividend $min
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-1073741824 * 2 + 0 = -2147483648}
+
+test expr-35.8 {expr edge cases} {longis32bit} {
+ set dividend [expr {$min + 1}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-1073741824 * 2 + 1 = -2147483647}
+
+test expr-35.9 {expr edge cases} {longis32bit} {
+ set dividend [expr {$min + 2}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-1073741823 * 2 + 0 = -2147483646}
+
+test expr-35.10 {expr edge cases} {longis32bit} {
+ # Two things could happen here. The multiplication
+ # could overflow a 32 bit type, so that when
+ # 1 is added it overflows again back to min.
+ # The multiplication could also use a wide type
+ # to hold ($min - 1) until 1 is added and
+ # the number becomes $min again.
+ set dividend $min
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-715827883 * 3 + 1 = -2147483648}
+
+test expr-35.11 {expr edge cases} {longis32bit} {
+ set dividend $min
+ set divisor -3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {715827882 * -3 + -2 = -2147483648}
+
+test expr-35.12 {expr edge cases} {longis32bit} {
+ set dividend $min
+ set divisor $min
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1 * -2147483648 + 0 = -2147483648}
+
+test expr-35.13 {expr edge cases} {longis32bit} {
+ set dividend $min
+ set divisor [expr {$min + 1}]
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1 * -2147483647 + -1 = -2147483648}
+
+test expr-35.14 {expr edge cases} {longis32bit} {
+ set dividend $min
+ set divisor [expr {$min + 2}]
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1 * -2147483646 + -2 = -2147483648}
+
+# 64bit wide integer checks
+
+set min -9223372036854775808
+set max 9223372036854775807
+
+test expr-36.1 {expr edge cases} {wideis64bit} {
+ expr {$min / $min}
+} {1}
+
+test expr-36.2 {expr edge cases} {wideis64bit} {
+ expr {$min % $min}
+} {0}
+
+test expr-36.3 {expr edge cases} {wideis64bit} {
+ expr {$min / ($min + 1)}
+} {1}
+
+test expr-36.4 {expr edge cases} {wideis64bit} {
+ expr {$min % ($min + 1)}
+} {-1}
+
+test expr-36.5 {expr edge cases} {wideis64bit} {
+ expr {$min / ($min + 2)}
+} {1}
+
+test expr-36.6 {expr edge cases} {wideis64bit} {
+ expr {$min % ($min + 2)}
+} {-2}
+
+test expr-36.7 {expr edge cases} {wideis64bit} {
+ expr {$min / ($min + 3)}
+} {1}
+
+test expr-36.8 {expr edge cases} {wideis64bit} {
+ expr {$min % ($min + 3)}
+} {-3}
+
+test expr-36.9 {expr edge cases} {wideis64bit} {
+ expr {$min / -3}
+} {3074457345618258602}
+
+test expr-36.10 {expr edge cases} {wideis64bit} {
+ expr {$min % -3}
+} {-2}
+
+test expr-36.11 {expr edge cases} {wideis64bit} {
+ expr {$min / -2}
+} {4611686018427387904}
+
+test expr-36.12 {expr edge cases} {wideis64bit} {
+ expr {$min % -2}
+} {0}
+
+test expr-36.13 {expr edge cases} {wideis64bit} {
+ expr {$min / -1}
+} $min
+
+test expr-36.14 {expr edge cases} {wideis64bit} {
+ expr {$min % -1}
+} {0}
+
+test expr-36.15 {expr edge cases} {wideis64bit} {
+ expr {$min * -1}
+} $min
+
+test expr-36.16 {expr edge cases} {wideis64bit} {
+ expr {-$min}
+} $min
+
+test expr-36.17 {expr edge cases} {wideis64bit} {
+ expr {$min / 1}
+} $min
+
+test expr-36.18 {expr edge cases} {wideis64bit} {
+ expr {$min % 1}
+} {0}
+
+test expr-36.19 {expr edge cases} {wideis64bit} {
+ expr {$min / 2}
+} {-4611686018427387904}
+
+test expr-36.20 {expr edge cases} {wideis64bit} {
+ expr {$min % 2}
+} {0}
+
+test expr-36.21 {expr edge cases} {wideis64bit} {
+ expr {$min / 3}
+} {-3074457345618258603}
+
+test expr-36.22 {expr edge cases} {wideis64bit} {
+ expr {$min % 3}
+} {1}
+
+test expr-36.23 {expr edge cases} {wideis64bit} {
+ expr {$min / ($max - 3)}
+} {-2}
+
+test expr-36.24 {expr edge cases} {wideis64bit} {
+ expr {$min % ($max - 3)}
+} {9223372036854775800}
+
+test expr-36.25 {expr edge cases} {wideis64bit} {
+ expr {$min / ($max - 2)}
+} {-2}
+
+test expr-36.26 {expr edge cases} {wideis64bit} {
+ expr {$min % ($max - 2)}
+} {9223372036854775802}
+
+test expr-36.27 {expr edge cases} {wideis64bit} {
+ expr {$min / ($max - 1)}
+} {-2}
+
+test expr-36.28 {expr edge cases} {wideis64bit} {
+ expr {$min % ($max - 1)}
+} {9223372036854775804}
+
+test expr-36.29 {expr edge cases} {wideis64bit} {
+ expr {$min / $max}
+} {-2}
+
+test expr-36.30 {expr edge cases} {wideis64bit} {
+ expr {$min % $max}
+} {9223372036854775806}
+
+test expr-36.31 {expr edge cases} {wideis64bit} {
+ expr {$max / $max}
+} {1}
+
+test expr-36.32 {expr edge cases} {wideis64bit} {
+ expr {$max % $max}
+} {0}
+
+test expr-36.33 {expr edge cases} {wideis64bit} {
+ expr {$max / ($max - 1)}
+} {1}
+
+test expr-36.34 {expr edge cases} {wideis64bit} {
+ expr {$max % ($max - 1)}
+} {1}
+
+test expr-36.35 {expr edge cases} {wideis64bit} {
+ expr {$max / ($max - 2)}
+} {1}
+
+test expr-36.36 {expr edge cases} {wideis64bit} {
+ expr {$max % ($max - 2)}
+} {2}
+
+test expr-36.37 {expr edge cases} {wideis64bit} {
+ expr {$max / ($max - 3)}
+} {1}
+
+test expr-36.38 {expr edge cases} {wideis64bit} {
+ expr {$max % ($max - 3)}
+} {3}
+
+test expr-36.39 {expr edge cases} {wideis64bit} {
+ expr {$max / 3}
+} {3074457345618258602}
+
+test expr-36.40 {expr edge cases} {wideis64bit} {
+ expr {$max % 3}
+} {1}
+
+test expr-36.41 {expr edge cases} {wideis64bit} {
+ expr {$max / 2}
+} {4611686018427387903}
+
+test expr-36.42 {expr edge cases} {wideis64bit} {
+ expr {$max % 2}
+} {1}
+
+test expr-36.43 {expr edge cases} {wideis64bit} {
+ expr {$max / 1}
+} $max
+
+test expr-36.44 {expr edge cases} {wideis64bit} {
+ expr {$max % 1}
+} {0}
+
+test expr-36.45 {expr edge cases} {wideis64bit} {
+ expr {$max / -1}
+} "-$max"
+
+test expr-36.46 {expr edge cases} {wideis64bit} {
+ expr {$max % -1}
+} {0}
+
+test expr-36.47 {expr edge cases} {wideis64bit} {
+ expr {$max / -2}
+} {-4611686018427387904}
+
+test expr-36.48 {expr edge cases} {wideis64bit} {
+ expr {$max % -2}
+} {-1}
+
+test expr-36.49 {expr edge cases} {wideis64bit} {
+ expr {$max / -3}
+} {-3074457345618258603}
+
+test expr-36.50 {expr edge cases} {wideis64bit} {
+ expr {$max % -3}
+} {-2}
+
+test expr-36.51 {expr edge cases} {wideis64bit} {
+ expr {$max / ($min + 3)}
+} {-2}
+
+test expr-36.52 {expr edge cases} {wideis64bit} {
+ expr {$max % ($min + 3)}
+} {-9223372036854775803}
+
+test expr-36.53 {expr edge cases} {wideis64bit} {
+ expr {$max / ($min + 2)}
+} {-2}
+
+test expr-36.54 {expr edge cases} {wideis64bit} {
+ expr {$max % ($min + 2)}
+} {-9223372036854775805}
+
+test expr-36.55 {expr edge cases} {wideis64bit} {
+ expr {$max / ($min + 1)}
+} {-1}
+
+test expr-36.56 {expr edge cases} {wideis64bit} {
+ expr {$max % ($min + 1)}
+} {0}
+
+test expr-36.57 {expr edge cases} {wideis64bit} {
+ expr {$max / $min}
+} {-1}
+
+test expr-36.58 {expr edge cases} {wideis64bit} {
+ expr {$max % $min}
+} {-1}
+
+test expr-36.59 {expr edge cases} {wideis64bit} {
+ expr {($min + 1) / ($max - 1)}
+} {-2}
+
+test expr-36.60 {expr edge cases} {wideis64bit} {
+ expr {($min + 1) % ($max - 1)}
+} {9223372036854775805}
+
+test expr-36.61 {expr edge cases} {wideis64bit} {
+ expr {($max - 1) / ($min + 1)}
+} {-1}
+
+test expr-36.62 {expr edge cases} {wideis64bit} {
+ expr {($max - 1) % ($min + 1)}
+} {-1}
+
+test expr-36.63 {expr edge cases} {wideis64bit} {
+ expr {($max - 1) / $min}
+} {-1}
+
+test expr-36.64 {expr edge cases} {wideis64bit} {
+ expr {($max - 1) % $min}
+} {-2}
+
+test expr-36.65 {expr edge cases} {wideis64bit} {
+ expr {($max - 2) / $min}
+} {-1}
+
+test expr-36.66 {expr edge cases} {wideis64bit} {
+ expr {($max - 2) % $min}
+} {-3}
+
+test expr-36.67 {expr edge cases} {wideis64bit} {
+ expr {($max - 3) / $min}
+} {-1}
+
+test expr-36.68 {expr edge cases} {wideis64bit} {
+ expr {($max - 3) % $min}
+} {-4}
+
+test expr-36.69 {expr edge cases} {wideis64bit} {
+ expr {-3 / $min}
+} {0}
+
+test expr-36.70 {expr edge cases} {wideis64bit} {
+ expr {-3 % $min}
+} {-3}
+
+test expr-36.71 {expr edge cases} {wideis64bit} {
+ expr {-2 / $min}
+} {0}
+
+test expr-36.72 {expr edge cases} {wideis64bit} {
+ expr {-2 % $min}
+} {-2}
+
+test expr-36.73 {expr edge cases} {wideis64bit} {
+ expr {-1 / $min}
+} {0}
+
+test expr-36.74 {expr edge cases} {wideis64bit} {
+ expr {-1 % $min}
+} {-1}
+
+test expr-36.75 {expr edge cases} {wideis64bit} {
+ expr {0 / $min}
+} {0}
+
+test expr-36.76 {expr edge cases} {wideis64bit} {
+ expr {0 % $min}
+} {0}
+
+test expr-36.77 {expr edge cases} {wideis64bit} {
+ expr {0 / ($min + 1)}
+} {0}
+
+test expr-36.78 {expr edge cases} {wideis64bit} {
+ expr {0 % ($min + 1)}
+} {0}
+
+test expr-36.79 {expr edge cases} {wideis64bit} {
+ expr {1 / $min}
+} {-1}
+
+test expr-36.80 {expr edge cases} {wideis64bit} {
+ expr {1 % $min}
+} {-9223372036854775807}
+
+test expr-36.81 {expr edge cases} {wideis64bit} {
+ expr {1 / ($min + 1)}
+} {-1}
+
+test expr-36.82 {expr edge cases} {wideis64bit} {
+ expr {1 % ($min + 1)}
+} {-9223372036854775806}
+
+test expr-36.83 {expr edge cases} {wideis64bit} {
+ expr {2 / $min}
+} {-1}
+
+test expr-36.84 {expr edge cases} {wideis64bit} {
+ expr {2 % $min}
+} {-9223372036854775806}
+
+test expr-36.85 {expr edge cases} {wideis64bit} {
+ expr {2 / ($min + 1)}
+} {-1}
+
+test expr-36.86 {expr edge cases} {wideis64bit} {
+ expr {2 % ($min + 1)}
+} {-9223372036854775805}
+
+test expr-36.87 {expr edge cases} {wideis64bit} {
+ expr {3 / $min}
+} {-1}
+
+test expr-36.88 {expr edge cases} {wideis64bit} {
+ expr {3 % $min}
+} {-9223372036854775805}
+
+test expr-36.89 {expr edge cases} {wideis64bit} {
+ expr {3 / ($min + 1)}
+} {-1}
+
+test expr-36.90 {expr edge cases} {wideis64bit} {
+ expr {3 % ($min + 1)}
+} {-9223372036854775804}
+
+
+test expr-37.1 {expr edge cases} {wideis64bit} {
+ set dividend $max
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($divisor * $q) + $r}]
+} {4611686018427387903 * 2 + 1 = 9223372036854775807}
+
+test expr-37.2 {expr edge cases} {wideis64bit} {
+ set dividend [expr {$max - 1}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {4611686018427387903 * 2 + 0 = 9223372036854775806}
+
+test expr-37.3 {expr edge cases} {wideis64bit} {
+ set dividend [expr {$max - 2}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {4611686018427387902 * 2 + 1 = 9223372036854775805}
+
+test expr-37.4 {expr edge cases} {wideis64bit} {
+ set dividend $max
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {3074457345618258602 * 3 + 1 = 9223372036854775807}
+
+test expr-37.5 {expr edge cases} {wideis64bit} {
+ set dividend [expr {$max - 1}]
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {3074457345618258602 * 3 + 0 = 9223372036854775806}
+
+test expr-37.6 {expr edge cases} {wideis64bit} {
+ set dividend [expr {$max - 2}]
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {3074457345618258601 * 3 + 2 = 9223372036854775805}
+
+test expr-37.7 {expr edge cases} {wideis64bit} {
+ set dividend $min
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-4611686018427387904 * 2 + 0 = -9223372036854775808}
+
+test expr-37.8 {expr edge cases} {wideis64bit} {
+ set dividend [expr {$min + 1}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-4611686018427387904 * 2 + 1 = -9223372036854775807}
+
+test expr-37.9 {expr edge cases} {wideis64bit} {
+ set dividend [expr {$min + 2}]
+ set divisor 2
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-4611686018427387903 * 2 + 0 = -9223372036854775806}
+
+test expr-37.10 {expr edge cases} {wideis64bit} {
+ # Multiplication overflows 64 bit type here,
+ # so when the 1 is added it overflows
+ # again and we end up back at min.
+ set dividend $min
+ set divisor 3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {-3074457345618258603 * 3 + 1 = -9223372036854775808}
+
+test expr-37.11 {expr edge cases} {wideis64bit} {
+ set dividend $min
+ set divisor -3
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {3074457345618258602 * -3 + -2 = -9223372036854775808}
+
+test expr-37.12 {expr edge cases} {wideis64bit} {
+ set dividend $min
+ set divisor $min
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1 * -9223372036854775808 + 0 = -9223372036854775808}
+
+test expr-37.13 {expr edge cases} {wideis64bit} {
+ set dividend $min
+ set divisor [expr {$min + 1}]
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1 * -9223372036854775807 + -1 = -9223372036854775808}
+
+test expr-37.14 {expr edge cases} {wideis64bit} {
+ set dividend $min
+ set divisor [expr {$min + 2}]
+ set q [expr {$dividend / $divisor}]
+ set r [expr {$dividend % $divisor}]
+ list $q * $divisor + $r = [expr {($q * $divisor) + $r}]
+} {1 * -9223372036854775806 + -2 = -9223372036854775808}
+
+
# cleanup
if {[info exists a]} {
unset a
}
+catch {unset min}
+catch {unset max}
::tcltest::cleanupTests
return