diff --git a/expr_test.go b/expr_test.go index 1bce3c8dc..1598a44ae 100644 --- a/expr_test.go +++ b/expr_test.go @@ -813,7 +813,7 @@ func TestExpr(t *testing.T) { }, { `Int32 + Int64`, - 0, + int64(0), }, { `Float64 + 0`, diff --git a/test/issues/804/issue_test.go b/test/issues/804/issue_test.go new file mode 100644 index 000000000..127323f0b --- /dev/null +++ b/test/issues/804/issue_test.go @@ -0,0 +1,58 @@ +package issue_test + +import ( + "math" + "testing" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/internal/testify/require" +) + +// TestIssue804 verifies that arithmetic operations on int64 and uint64 +// operands preserve 64-bit precision instead of truncating to int +// (which is 32-bit on 32-bit architectures). +func TestIssue804(t *testing.T) { + env := map[string]any{ + "a": int64(math.MaxInt32), + "b": int64(1), + } + + // int64 + int64 must produce int64, not int. + out, err := expr.Eval("a + b", env) + require.NoError(t, err) + require.Equal(t, int64(math.MaxInt32)+1, out) + + // int64 - int64 + out, err = expr.Eval("a - b", env) + require.NoError(t, err) + require.Equal(t, int64(math.MaxInt32)-1, out) + + // int64 * int64 + out, err = expr.Eval("a * b", env) + require.NoError(t, err) + require.Equal(t, int64(math.MaxInt32), out) +} + +func TestIssue804_uint64(t *testing.T) { + env := map[string]any{ + "a": uint64(math.MaxUint32), + "b": uint64(1), + } + + // uint64 + uint64 must produce uint64, not int. + out, err := expr.Eval("a + b", env) + require.NoError(t, err) + require.Equal(t, uint64(math.MaxUint32)+1, out) +} + +func TestIssue804_mixed(t *testing.T) { + env := map[string]any{ + "a": int32(100), + "b": int64(math.MaxInt32), + } + + // int32 + int64 must produce int64. + out, err := expr.Eval("a + b", env) + require.NoError(t, err) + require.Equal(t, int64(100)+int64(math.MaxInt32), out) +} diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index 54a4fc235..f26816dca 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -72,6 +72,12 @@ func cases(op string, xs ...[]string) string { echo(`switch y := b.(type) {`) for _, b := range types { t := "int" + if (isInt64(a) || isInt64(b)) && isSigned(a) && isSigned(b) { + t = "int64" + } + if (isUint64(a) || isUint64(b)) && isUnsigned(a) && isUnsigned(b) { + t = "uint64" + } if isDuration(a) || isDuration(b) { t = "time.Duration" } @@ -133,6 +139,22 @@ func isFloat(t string) bool { return strings.HasPrefix(t, "float") } +func isInt64(t string) bool { + return t == "int64" +} + +func isUint64(t string) bool { + return t == "uint64" +} + +func isSigned(t string) bool { + return t == "int" || t == "int8" || t == "int16" || t == "int32" || t == "int64" +} + +func isUnsigned(t string) bool { + return t == "uint" || t == "uint8" || t == "uint16" || t == "uint32" || t == "uint64" +} + func isDuration(t string) bool { return t == "time.Duration" } @@ -323,7 +345,7 @@ func Divide(a, b interface{}) float64 { panic(fmt.Sprintf("invalid operation: %T / %T", a, b)) } -func Modulo(a, b interface{}) int { +func Modulo(a, b interface{}) interface{} { switch x := a.(type) { {{ cases_int_only "%" }} } diff --git a/vm/runtime/helpers[generated].go b/vm/runtime/helpers[generated].go index d950f1111..d6ee84c76 100644 --- a/vm/runtime/helpers[generated].go +++ b/vm/runtime/helpers[generated].go @@ -21,7 +21,7 @@ func Equal(a, b interface{}) bool { case uint32: return int(x) == int(y) case uint64: - return int(x) == int(y) + return uint64(x) == uint64(y) case int: return int(x) == int(y) case int8: @@ -48,7 +48,7 @@ func Equal(a, b interface{}) bool { case uint32: return int(x) == int(y) case uint64: - return int(x) == int(y) + return uint64(x) == uint64(y) case int: return int(x) == int(y) case int8: @@ -75,7 +75,7 @@ func Equal(a, b interface{}) bool { case uint32: return int(x) == int(y) case uint64: - return int(x) == int(y) + return uint64(x) == uint64(y) case int: return int(x) == int(y) case int8: @@ -102,7 +102,7 @@ func Equal(a, b interface{}) bool { case uint32: return int(x) == int(y) case uint64: - return int(x) == int(y) + return uint64(x) == uint64(y) case int: return int(x) == int(y) case int8: @@ -121,15 +121,15 @@ func Equal(a, b interface{}) bool { case uint64: switch y := b.(type) { case uint: - return int(x) == int(y) + return uint64(x) == uint64(y) case uint8: - return int(x) == int(y) + return uint64(x) == uint64(y) case uint16: - return int(x) == int(y) + return uint64(x) == uint64(y) case uint32: - return int(x) == int(y) + return uint64(x) == uint64(y) case uint64: - return int(x) == int(y) + return uint64(x) == uint64(y) case int: return int(x) == int(y) case int8: @@ -166,7 +166,7 @@ func Equal(a, b interface{}) bool { case int32: return int(x) == int(y) case int64: - return int(x) == int(y) + return int64(x) == int64(y) case float32: return float64(x) == float64(y) case float64: @@ -193,7 +193,7 @@ func Equal(a, b interface{}) bool { case int32: return int(x) == int(y) case int64: - return int(x) == int(y) + return int64(x) == int64(y) case float32: return float64(x) == float64(y) case float64: @@ -220,7 +220,7 @@ func Equal(a, b interface{}) bool { case int32: return int(x) == int(y) case int64: - return int(x) == int(y) + return int64(x) == int64(y) case float32: return float64(x) == float64(y) case float64: @@ -247,7 +247,7 @@ func Equal(a, b interface{}) bool { case int32: return int(x) == int(y) case int64: - return int(x) == int(y) + return int64(x) == int64(y) case float32: return float64(x) == float64(y) case float64: @@ -266,15 +266,15 @@ func Equal(a, b interface{}) bool { case uint64: return int(x) == int(y) case int: - return int(x) == int(y) + return int64(x) == int64(y) case int8: - return int(x) == int(y) + return int64(x) == int64(y) case int16: - return int(x) == int(y) + return int64(x) == int64(y) case int32: - return int(x) == int(y) + return int64(x) == int64(y) case int64: - return int(x) == int(y) + return int64(x) == int64(y) case float32: return float64(x) == float64(y) case float64: @@ -712,7 +712,7 @@ func Less(a, b interface{}) bool { case uint32: return int(x) < int(y) case uint64: - return int(x) < int(y) + return uint64(x) < uint64(y) case int: return int(x) < int(y) case int8: @@ -739,7 +739,7 @@ func Less(a, b interface{}) bool { case uint32: return int(x) < int(y) case uint64: - return int(x) < int(y) + return uint64(x) < uint64(y) case int: return int(x) < int(y) case int8: @@ -766,7 +766,7 @@ func Less(a, b interface{}) bool { case uint32: return int(x) < int(y) case uint64: - return int(x) < int(y) + return uint64(x) < uint64(y) case int: return int(x) < int(y) case int8: @@ -793,7 +793,7 @@ func Less(a, b interface{}) bool { case uint32: return int(x) < int(y) case uint64: - return int(x) < int(y) + return uint64(x) < uint64(y) case int: return int(x) < int(y) case int8: @@ -812,15 +812,15 @@ func Less(a, b interface{}) bool { case uint64: switch y := b.(type) { case uint: - return int(x) < int(y) + return uint64(x) < uint64(y) case uint8: - return int(x) < int(y) + return uint64(x) < uint64(y) case uint16: - return int(x) < int(y) + return uint64(x) < uint64(y) case uint32: - return int(x) < int(y) + return uint64(x) < uint64(y) case uint64: - return int(x) < int(y) + return uint64(x) < uint64(y) case int: return int(x) < int(y) case int8: @@ -857,7 +857,7 @@ func Less(a, b interface{}) bool { case int32: return int(x) < int(y) case int64: - return int(x) < int(y) + return int64(x) < int64(y) case float32: return float64(x) < float64(y) case float64: @@ -884,7 +884,7 @@ func Less(a, b interface{}) bool { case int32: return int(x) < int(y) case int64: - return int(x) < int(y) + return int64(x) < int64(y) case float32: return float64(x) < float64(y) case float64: @@ -911,7 +911,7 @@ func Less(a, b interface{}) bool { case int32: return int(x) < int(y) case int64: - return int(x) < int(y) + return int64(x) < int64(y) case float32: return float64(x) < float64(y) case float64: @@ -938,7 +938,7 @@ func Less(a, b interface{}) bool { case int32: return int(x) < int(y) case int64: - return int(x) < int(y) + return int64(x) < int64(y) case float32: return float64(x) < float64(y) case float64: @@ -957,15 +957,15 @@ func Less(a, b interface{}) bool { case uint64: return int(x) < int(y) case int: - return int(x) < int(y) + return int64(x) < int64(y) case int8: - return int(x) < int(y) + return int64(x) < int64(y) case int16: - return int(x) < int(y) + return int64(x) < int64(y) case int32: - return int(x) < int(y) + return int64(x) < int64(y) case int64: - return int(x) < int(y) + return int64(x) < int64(y) case float32: return float64(x) < float64(y) case float64: @@ -1057,7 +1057,7 @@ func More(a, b interface{}) bool { case uint32: return int(x) > int(y) case uint64: - return int(x) > int(y) + return uint64(x) > uint64(y) case int: return int(x) > int(y) case int8: @@ -1084,7 +1084,7 @@ func More(a, b interface{}) bool { case uint32: return int(x) > int(y) case uint64: - return int(x) > int(y) + return uint64(x) > uint64(y) case int: return int(x) > int(y) case int8: @@ -1111,7 +1111,7 @@ func More(a, b interface{}) bool { case uint32: return int(x) > int(y) case uint64: - return int(x) > int(y) + return uint64(x) > uint64(y) case int: return int(x) > int(y) case int8: @@ -1138,7 +1138,7 @@ func More(a, b interface{}) bool { case uint32: return int(x) > int(y) case uint64: - return int(x) > int(y) + return uint64(x) > uint64(y) case int: return int(x) > int(y) case int8: @@ -1157,15 +1157,15 @@ func More(a, b interface{}) bool { case uint64: switch y := b.(type) { case uint: - return int(x) > int(y) + return uint64(x) > uint64(y) case uint8: - return int(x) > int(y) + return uint64(x) > uint64(y) case uint16: - return int(x) > int(y) + return uint64(x) > uint64(y) case uint32: - return int(x) > int(y) + return uint64(x) > uint64(y) case uint64: - return int(x) > int(y) + return uint64(x) > uint64(y) case int: return int(x) > int(y) case int8: @@ -1202,7 +1202,7 @@ func More(a, b interface{}) bool { case int32: return int(x) > int(y) case int64: - return int(x) > int(y) + return int64(x) > int64(y) case float32: return float64(x) > float64(y) case float64: @@ -1229,7 +1229,7 @@ func More(a, b interface{}) bool { case int32: return int(x) > int(y) case int64: - return int(x) > int(y) + return int64(x) > int64(y) case float32: return float64(x) > float64(y) case float64: @@ -1256,7 +1256,7 @@ func More(a, b interface{}) bool { case int32: return int(x) > int(y) case int64: - return int(x) > int(y) + return int64(x) > int64(y) case float32: return float64(x) > float64(y) case float64: @@ -1283,7 +1283,7 @@ func More(a, b interface{}) bool { case int32: return int(x) > int(y) case int64: - return int(x) > int(y) + return int64(x) > int64(y) case float32: return float64(x) > float64(y) case float64: @@ -1302,15 +1302,15 @@ func More(a, b interface{}) bool { case uint64: return int(x) > int(y) case int: - return int(x) > int(y) + return int64(x) > int64(y) case int8: - return int(x) > int(y) + return int64(x) > int64(y) case int16: - return int(x) > int(y) + return int64(x) > int64(y) case int32: - return int(x) > int(y) + return int64(x) > int64(y) case int64: - return int(x) > int(y) + return int64(x) > int64(y) case float32: return float64(x) > float64(y) case float64: @@ -1402,7 +1402,7 @@ func LessOrEqual(a, b interface{}) bool { case uint32: return int(x) <= int(y) case uint64: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case int: return int(x) <= int(y) case int8: @@ -1429,7 +1429,7 @@ func LessOrEqual(a, b interface{}) bool { case uint32: return int(x) <= int(y) case uint64: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case int: return int(x) <= int(y) case int8: @@ -1456,7 +1456,7 @@ func LessOrEqual(a, b interface{}) bool { case uint32: return int(x) <= int(y) case uint64: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case int: return int(x) <= int(y) case int8: @@ -1483,7 +1483,7 @@ func LessOrEqual(a, b interface{}) bool { case uint32: return int(x) <= int(y) case uint64: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case int: return int(x) <= int(y) case int8: @@ -1502,15 +1502,15 @@ func LessOrEqual(a, b interface{}) bool { case uint64: switch y := b.(type) { case uint: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case uint8: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case uint16: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case uint32: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case uint64: - return int(x) <= int(y) + return uint64(x) <= uint64(y) case int: return int(x) <= int(y) case int8: @@ -1547,7 +1547,7 @@ func LessOrEqual(a, b interface{}) bool { case int32: return int(x) <= int(y) case int64: - return int(x) <= int(y) + return int64(x) <= int64(y) case float32: return float64(x) <= float64(y) case float64: @@ -1574,7 +1574,7 @@ func LessOrEqual(a, b interface{}) bool { case int32: return int(x) <= int(y) case int64: - return int(x) <= int(y) + return int64(x) <= int64(y) case float32: return float64(x) <= float64(y) case float64: @@ -1601,7 +1601,7 @@ func LessOrEqual(a, b interface{}) bool { case int32: return int(x) <= int(y) case int64: - return int(x) <= int(y) + return int64(x) <= int64(y) case float32: return float64(x) <= float64(y) case float64: @@ -1628,7 +1628,7 @@ func LessOrEqual(a, b interface{}) bool { case int32: return int(x) <= int(y) case int64: - return int(x) <= int(y) + return int64(x) <= int64(y) case float32: return float64(x) <= float64(y) case float64: @@ -1647,15 +1647,15 @@ func LessOrEqual(a, b interface{}) bool { case uint64: return int(x) <= int(y) case int: - return int(x) <= int(y) + return int64(x) <= int64(y) case int8: - return int(x) <= int(y) + return int64(x) <= int64(y) case int16: - return int(x) <= int(y) + return int64(x) <= int64(y) case int32: - return int(x) <= int(y) + return int64(x) <= int64(y) case int64: - return int(x) <= int(y) + return int64(x) <= int64(y) case float32: return float64(x) <= float64(y) case float64: @@ -1747,7 +1747,7 @@ func MoreOrEqual(a, b interface{}) bool { case uint32: return int(x) >= int(y) case uint64: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case int: return int(x) >= int(y) case int8: @@ -1774,7 +1774,7 @@ func MoreOrEqual(a, b interface{}) bool { case uint32: return int(x) >= int(y) case uint64: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case int: return int(x) >= int(y) case int8: @@ -1801,7 +1801,7 @@ func MoreOrEqual(a, b interface{}) bool { case uint32: return int(x) >= int(y) case uint64: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case int: return int(x) >= int(y) case int8: @@ -1828,7 +1828,7 @@ func MoreOrEqual(a, b interface{}) bool { case uint32: return int(x) >= int(y) case uint64: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case int: return int(x) >= int(y) case int8: @@ -1847,15 +1847,15 @@ func MoreOrEqual(a, b interface{}) bool { case uint64: switch y := b.(type) { case uint: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case uint8: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case uint16: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case uint32: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case uint64: - return int(x) >= int(y) + return uint64(x) >= uint64(y) case int: return int(x) >= int(y) case int8: @@ -1892,7 +1892,7 @@ func MoreOrEqual(a, b interface{}) bool { case int32: return int(x) >= int(y) case int64: - return int(x) >= int(y) + return int64(x) >= int64(y) case float32: return float64(x) >= float64(y) case float64: @@ -1919,7 +1919,7 @@ func MoreOrEqual(a, b interface{}) bool { case int32: return int(x) >= int(y) case int64: - return int(x) >= int(y) + return int64(x) >= int64(y) case float32: return float64(x) >= float64(y) case float64: @@ -1946,7 +1946,7 @@ func MoreOrEqual(a, b interface{}) bool { case int32: return int(x) >= int(y) case int64: - return int(x) >= int(y) + return int64(x) >= int64(y) case float32: return float64(x) >= float64(y) case float64: @@ -1973,7 +1973,7 @@ func MoreOrEqual(a, b interface{}) bool { case int32: return int(x) >= int(y) case int64: - return int(x) >= int(y) + return int64(x) >= int64(y) case float32: return float64(x) >= float64(y) case float64: @@ -1992,15 +1992,15 @@ func MoreOrEqual(a, b interface{}) bool { case uint64: return int(x) >= int(y) case int: - return int(x) >= int(y) + return int64(x) >= int64(y) case int8: - return int(x) >= int(y) + return int64(x) >= int64(y) case int16: - return int(x) >= int(y) + return int64(x) >= int64(y) case int32: - return int(x) >= int(y) + return int64(x) >= int64(y) case int64: - return int(x) >= int(y) + return int64(x) >= int64(y) case float32: return float64(x) >= float64(y) case float64: @@ -2092,7 +2092,7 @@ func Add(a, b interface{}) interface{} { case uint32: return int(x) + int(y) case uint64: - return int(x) + int(y) + return uint64(x) + uint64(y) case int: return int(x) + int(y) case int8: @@ -2119,7 +2119,7 @@ func Add(a, b interface{}) interface{} { case uint32: return int(x) + int(y) case uint64: - return int(x) + int(y) + return uint64(x) + uint64(y) case int: return int(x) + int(y) case int8: @@ -2146,7 +2146,7 @@ func Add(a, b interface{}) interface{} { case uint32: return int(x) + int(y) case uint64: - return int(x) + int(y) + return uint64(x) + uint64(y) case int: return int(x) + int(y) case int8: @@ -2173,7 +2173,7 @@ func Add(a, b interface{}) interface{} { case uint32: return int(x) + int(y) case uint64: - return int(x) + int(y) + return uint64(x) + uint64(y) case int: return int(x) + int(y) case int8: @@ -2192,15 +2192,15 @@ func Add(a, b interface{}) interface{} { case uint64: switch y := b.(type) { case uint: - return int(x) + int(y) + return uint64(x) + uint64(y) case uint8: - return int(x) + int(y) + return uint64(x) + uint64(y) case uint16: - return int(x) + int(y) + return uint64(x) + uint64(y) case uint32: - return int(x) + int(y) + return uint64(x) + uint64(y) case uint64: - return int(x) + int(y) + return uint64(x) + uint64(y) case int: return int(x) + int(y) case int8: @@ -2237,7 +2237,7 @@ func Add(a, b interface{}) interface{} { case int32: return int(x) + int(y) case int64: - return int(x) + int(y) + return int64(x) + int64(y) case float32: return float64(x) + float64(y) case float64: @@ -2264,7 +2264,7 @@ func Add(a, b interface{}) interface{} { case int32: return int(x) + int(y) case int64: - return int(x) + int(y) + return int64(x) + int64(y) case float32: return float64(x) + float64(y) case float64: @@ -2291,7 +2291,7 @@ func Add(a, b interface{}) interface{} { case int32: return int(x) + int(y) case int64: - return int(x) + int(y) + return int64(x) + int64(y) case float32: return float64(x) + float64(y) case float64: @@ -2318,7 +2318,7 @@ func Add(a, b interface{}) interface{} { case int32: return int(x) + int(y) case int64: - return int(x) + int(y) + return int64(x) + int64(y) case float32: return float64(x) + float64(y) case float64: @@ -2337,15 +2337,15 @@ func Add(a, b interface{}) interface{} { case uint64: return int(x) + int(y) case int: - return int(x) + int(y) + return int64(x) + int64(y) case int8: - return int(x) + int(y) + return int64(x) + int64(y) case int16: - return int(x) + int(y) + return int64(x) + int64(y) case int32: - return int(x) + int(y) + return int64(x) + int64(y) case int64: - return int(x) + int(y) + return int64(x) + int64(y) case float32: return float64(x) + float64(y) case float64: @@ -2439,7 +2439,7 @@ func Subtract(a, b interface{}) interface{} { case uint32: return int(x) - int(y) case uint64: - return int(x) - int(y) + return uint64(x) - uint64(y) case int: return int(x) - int(y) case int8: @@ -2466,7 +2466,7 @@ func Subtract(a, b interface{}) interface{} { case uint32: return int(x) - int(y) case uint64: - return int(x) - int(y) + return uint64(x) - uint64(y) case int: return int(x) - int(y) case int8: @@ -2493,7 +2493,7 @@ func Subtract(a, b interface{}) interface{} { case uint32: return int(x) - int(y) case uint64: - return int(x) - int(y) + return uint64(x) - uint64(y) case int: return int(x) - int(y) case int8: @@ -2520,7 +2520,7 @@ func Subtract(a, b interface{}) interface{} { case uint32: return int(x) - int(y) case uint64: - return int(x) - int(y) + return uint64(x) - uint64(y) case int: return int(x) - int(y) case int8: @@ -2539,15 +2539,15 @@ func Subtract(a, b interface{}) interface{} { case uint64: switch y := b.(type) { case uint: - return int(x) - int(y) + return uint64(x) - uint64(y) case uint8: - return int(x) - int(y) + return uint64(x) - uint64(y) case uint16: - return int(x) - int(y) + return uint64(x) - uint64(y) case uint32: - return int(x) - int(y) + return uint64(x) - uint64(y) case uint64: - return int(x) - int(y) + return uint64(x) - uint64(y) case int: return int(x) - int(y) case int8: @@ -2584,7 +2584,7 @@ func Subtract(a, b interface{}) interface{} { case int32: return int(x) - int(y) case int64: - return int(x) - int(y) + return int64(x) - int64(y) case float32: return float64(x) - float64(y) case float64: @@ -2611,7 +2611,7 @@ func Subtract(a, b interface{}) interface{} { case int32: return int(x) - int(y) case int64: - return int(x) - int(y) + return int64(x) - int64(y) case float32: return float64(x) - float64(y) case float64: @@ -2638,7 +2638,7 @@ func Subtract(a, b interface{}) interface{} { case int32: return int(x) - int(y) case int64: - return int(x) - int(y) + return int64(x) - int64(y) case float32: return float64(x) - float64(y) case float64: @@ -2665,7 +2665,7 @@ func Subtract(a, b interface{}) interface{} { case int32: return int(x) - int(y) case int64: - return int(x) - int(y) + return int64(x) - int64(y) case float32: return float64(x) - float64(y) case float64: @@ -2684,15 +2684,15 @@ func Subtract(a, b interface{}) interface{} { case uint64: return int(x) - int(y) case int: - return int(x) - int(y) + return int64(x) - int64(y) case int8: - return int(x) - int(y) + return int64(x) - int64(y) case int16: - return int(x) - int(y) + return int64(x) - int64(y) case int32: - return int(x) - int(y) + return int64(x) - int64(y) case int64: - return int(x) - int(y) + return int64(x) - int64(y) case float32: return float64(x) - float64(y) case float64: @@ -2781,7 +2781,7 @@ func Multiply(a, b interface{}) interface{} { case uint32: return int(x) * int(y) case uint64: - return int(x) * int(y) + return uint64(x) * uint64(y) case int: return int(x) * int(y) case int8: @@ -2810,7 +2810,7 @@ func Multiply(a, b interface{}) interface{} { case uint32: return int(x) * int(y) case uint64: - return int(x) * int(y) + return uint64(x) * uint64(y) case int: return int(x) * int(y) case int8: @@ -2839,7 +2839,7 @@ func Multiply(a, b interface{}) interface{} { case uint32: return int(x) * int(y) case uint64: - return int(x) * int(y) + return uint64(x) * uint64(y) case int: return int(x) * int(y) case int8: @@ -2868,7 +2868,7 @@ func Multiply(a, b interface{}) interface{} { case uint32: return int(x) * int(y) case uint64: - return int(x) * int(y) + return uint64(x) * uint64(y) case int: return int(x) * int(y) case int8: @@ -2889,15 +2889,15 @@ func Multiply(a, b interface{}) interface{} { case uint64: switch y := b.(type) { case uint: - return int(x) * int(y) + return uint64(x) * uint64(y) case uint8: - return int(x) * int(y) + return uint64(x) * uint64(y) case uint16: - return int(x) * int(y) + return uint64(x) * uint64(y) case uint32: - return int(x) * int(y) + return uint64(x) * uint64(y) case uint64: - return int(x) * int(y) + return uint64(x) * uint64(y) case int: return int(x) * int(y) case int8: @@ -2936,7 +2936,7 @@ func Multiply(a, b interface{}) interface{} { case int32: return int(x) * int(y) case int64: - return int(x) * int(y) + return int64(x) * int64(y) case float32: return float64(x) * float64(y) case float64: @@ -2965,7 +2965,7 @@ func Multiply(a, b interface{}) interface{} { case int32: return int(x) * int(y) case int64: - return int(x) * int(y) + return int64(x) * int64(y) case float32: return float64(x) * float64(y) case float64: @@ -2994,7 +2994,7 @@ func Multiply(a, b interface{}) interface{} { case int32: return int(x) * int(y) case int64: - return int(x) * int(y) + return int64(x) * int64(y) case float32: return float64(x) * float64(y) case float64: @@ -3023,7 +3023,7 @@ func Multiply(a, b interface{}) interface{} { case int32: return int(x) * int(y) case int64: - return int(x) * int(y) + return int64(x) * int64(y) case float32: return float64(x) * float64(y) case float64: @@ -3044,15 +3044,15 @@ func Multiply(a, b interface{}) interface{} { case uint64: return int(x) * int(y) case int: - return int(x) * int(y) + return int64(x) * int64(y) case int8: - return int(x) * int(y) + return int64(x) * int64(y) case int16: - return int(x) * int(y) + return int64(x) * int64(y) case int32: - return int(x) * int(y) + return int64(x) * int64(y) case int64: - return int(x) * int(y) + return int64(x) * int64(y) case float32: return float64(x) * float64(y) case float64: @@ -3481,7 +3481,7 @@ func Divide(a, b interface{}) float64 { panic(fmt.Sprintf("invalid operation: %T / %T", a, b)) } -func Modulo(a, b interface{}) int { +func Modulo(a, b interface{}) interface{} { switch x := a.(type) { case uint: switch y := b.(type) { @@ -3494,7 +3494,7 @@ func Modulo(a, b interface{}) int { case uint32: return int(x) % int(y) case uint64: - return int(x) % int(y) + return uint64(x) % uint64(y) case int: return int(x) % int(y) case int8: @@ -3517,7 +3517,7 @@ func Modulo(a, b interface{}) int { case uint32: return int(x) % int(y) case uint64: - return int(x) % int(y) + return uint64(x) % uint64(y) case int: return int(x) % int(y) case int8: @@ -3540,7 +3540,7 @@ func Modulo(a, b interface{}) int { case uint32: return int(x) % int(y) case uint64: - return int(x) % int(y) + return uint64(x) % uint64(y) case int: return int(x) % int(y) case int8: @@ -3563,7 +3563,7 @@ func Modulo(a, b interface{}) int { case uint32: return int(x) % int(y) case uint64: - return int(x) % int(y) + return uint64(x) % uint64(y) case int: return int(x) % int(y) case int8: @@ -3578,15 +3578,15 @@ func Modulo(a, b interface{}) int { case uint64: switch y := b.(type) { case uint: - return int(x) % int(y) + return uint64(x) % uint64(y) case uint8: - return int(x) % int(y) + return uint64(x) % uint64(y) case uint16: - return int(x) % int(y) + return uint64(x) % uint64(y) case uint32: - return int(x) % int(y) + return uint64(x) % uint64(y) case uint64: - return int(x) % int(y) + return uint64(x) % uint64(y) case int: return int(x) % int(y) case int8: @@ -3619,7 +3619,7 @@ func Modulo(a, b interface{}) int { case int32: return int(x) % int(y) case int64: - return int(x) % int(y) + return int64(x) % int64(y) } case int8: switch y := b.(type) { @@ -3642,7 +3642,7 @@ func Modulo(a, b interface{}) int { case int32: return int(x) % int(y) case int64: - return int(x) % int(y) + return int64(x) % int64(y) } case int16: switch y := b.(type) { @@ -3665,7 +3665,7 @@ func Modulo(a, b interface{}) int { case int32: return int(x) % int(y) case int64: - return int(x) % int(y) + return int64(x) % int64(y) } case int32: switch y := b.(type) { @@ -3688,7 +3688,7 @@ func Modulo(a, b interface{}) int { case int32: return int(x) % int(y) case int64: - return int(x) % int(y) + return int64(x) % int64(y) } case int64: switch y := b.(type) { @@ -3703,15 +3703,15 @@ func Modulo(a, b interface{}) int { case uint64: return int(x) % int(y) case int: - return int(x) % int(y) + return int64(x) % int64(y) case int8: - return int(x) % int(y) + return int64(x) % int64(y) case int16: - return int(x) % int(y) + return int64(x) % int64(y) case int32: - return int(x) % int(y) + return int64(x) % int64(y) case int64: - return int(x) % int(y) + return int64(x) % int64(y) } } panic(fmt.Sprintf("invalid operation: %T %% %T", a, b))