diff --git a/compiler/compiler.go b/compiler/compiler.go index 205d60234..72c9d30a7 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -345,7 +345,9 @@ func (c *compiler) IntegerNode(node *ast.IntegerNode) { } c.emitPush(int32(node.Value)) case reflect.Int64: - panic(fmt.Sprintf("constant %d overflows int64", node.Value)) + if node.Value > math.MaxInt64 || node.Value < math.MinInt64 { + panic(fmt.Sprintf("constant %d overflows int64", node.Value)) + } c.emitPush(int64(node.Value)) case reflect.Uint: if node.Value < 0 { diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index eb7f3d323..c65965da4 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -628,3 +628,23 @@ func TestCompile_optimizes_jumps(t *testing.T) { }) } } + +func TestCompile_IntegerArgsFunc(t *testing.T) { + env := mock.Env{} + codes := []string{ + "FuncInt(0)", + "FuncInt8(0)", + "FuncInt16(0)", + "FuncInt32(0)", + "FuncInt64(0)", + "FuncUint(0)", + "FuncUint8(0)", + "FuncUint16(0)", + "FuncUint32(0)", + "FuncUint64(0)", + } + for _, code := range codes { + _, err := expr.Compile(code, expr.Env(env)) + require.NoError(t, err) + } +} diff --git a/test/mock/mock.go b/test/mock/mock.go index 5c0fa9e3f..fc91652fb 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -65,6 +65,46 @@ func (p Env) FuncTyped(_ string) int { return 2023 } +func (p Env) FuncInt(_ int) int { + return 0 +} + +func (p Env) FuncUint(_ uint) int { + return 0 +} + +func (p Env) FuncInt8(_ float64) int { + return 0 +} + +func (p Env) FuncInt16(_ int16) int { + return 0 +} + +func (p Env) FuncInt32(_ int32) int { + return 0 +} + +func (p Env) FuncInt64(_ int64) int { + return 0 +} + +func (p Env) FuncUint8(_ uint8) int { + return 0 +} + +func (p Env) FuncUint16(_ uint16) int { + return 0 +} + +func (p Env) FuncUint32(_ uint32) int { + return 0 +} + +func (p Env) FuncUint64(_ uint64) int { + return 0 +} + func (p Env) TimeEqualString(a time.Time, s string) bool { return a.Format("2006-01-02") == s }