From a1752a57acab5ce21e50b38335e1a2324d2c66b1 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette Date: Wed, 10 Dec 2025 22:55:14 +0100 Subject: [PATCH] fix(gnovm): allow divisions by zero on floats --- gnovm/pkg/gnolang/op_binary.go | 11 ++--------- gnovm/tests/files/math6.gno | 16 ++++++++++++++++ gnovm/tests/files/math7.gno | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 gnovm/tests/files/math6.gno create mode 100644 gnovm/tests/files/math7.gno diff --git a/gnovm/pkg/gnolang/op_binary.go b/gnovm/pkg/gnolang/op_binary.go index 6f930eabc7e..7a971ed37b0 100644 --- a/gnovm/pkg/gnolang/op_binary.go +++ b/gnovm/pkg/gnolang/op_binary.go @@ -889,17 +889,10 @@ func quoAssign(lv, rv *TypedValue) *Exception { lv.SetUint64(lv.GetUint64() / rv.GetUint64()) case Float32Type: // NOTE: gno doesn't fuse *+. - ok := !softfloat.Feq32(rv.GetFloat32(), softfloat.Fintto32(0)) - - if ok { - lv.SetFloat32(softfloat.Fdiv32(lv.GetFloat32(), rv.GetFloat32())) - } + lv.SetFloat32(softfloat.Fdiv32(lv.GetFloat32(), rv.GetFloat32())) case Float64Type: // NOTE: gno doesn't fuse *+. - ok := !softfloat.Feq64(rv.GetFloat64(), softfloat.Fintto64(0)) - if ok { - lv.SetFloat64(softfloat.Fdiv64(lv.GetFloat64(), rv.GetFloat64())) - } + lv.SetFloat64(softfloat.Fdiv64(lv.GetFloat64(), rv.GetFloat64())) case UntypedBigintType: if rv.GetBigInt().Sign() == 0 { return expt diff --git a/gnovm/tests/files/math6.gno b/gnovm/tests/files/math6.gno new file mode 100644 index 00000000000..487672adc1b --- /dev/null +++ b/gnovm/tests/files/math6.gno @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" +) + +func main() { + var a float64 = 0.0 + var b float32 = 0.0 + fmt.Println(a / a) + fmt.Println(b / b) +} + +// Output: +// NaN +// NaN diff --git a/gnovm/tests/files/math7.gno b/gnovm/tests/files/math7.gno new file mode 100644 index 00000000000..260c907e824 --- /dev/null +++ b/gnovm/tests/files/math7.gno @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" +) + +func main() { + var a float64 = 0.0 + var b float32 = 0.0 + fmt.Println(1 / a) + fmt.Println(0 / a) + fmt.Println(-1 / a) + fmt.Println(1 / b) + fmt.Println(0 / b) + fmt.Println(-1 / b) +} + +// Output: +// +Inf +// NaN +// -Inf +// +Inf +// NaN +// -Inf