From 29c521da4bd6f81d1e989517f212768313a40654 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Jul 2020 15:59:18 -0700 Subject: [PATCH] Properly handle i32.trunc_f64_s of -2147483648.x --- interpreter/exec/i32_convert.ml | 2 +- test/core/conversions.wast | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interpreter/exec/i32_convert.ml b/interpreter/exec/i32_convert.ml index 482783a221..05814fa498 100644 --- a/interpreter/exec/i32_convert.ml +++ b/interpreter/exec/i32_convert.ml @@ -27,7 +27,7 @@ let trunc_f64_s x = raise Numeric_error.InvalidConversionToInteger else let xf = F64.to_float x in - if xf >= -.Int32.(to_float min_int) || xf < Int32.(to_float min_int) then + if xf >= -.Int32.(to_float min_int) || xf <= Int32.(to_float min_int) -. 1.0 then raise Numeric_error.IntegerOverflow else Int32.of_float xf diff --git a/test/core/conversions.wast b/test/core/conversions.wast index cfd65a3a24..65d09339ca 100644 --- a/test/core/conversions.wast +++ b/test/core/conversions.wast @@ -120,8 +120,8 @@ (assert_return (invoke "i32.trunc_f64_s" (f64.const -2.0)) (i32.const -2)) (assert_return (invoke "i32.trunc_f64_s" (f64.const 2147483647.0)) (i32.const 2147483647)) (assert_return (invoke "i32.trunc_f64_s" (f64.const -2147483648.0)) (i32.const -2147483648)) -(assert_return (invoke "i32.trunc_f64_s" (f64.const 2147483647.9999998)) (i32.const 2147483647)) -(assert_trap (invoke "i32.trunc_f64_s" (f64.const 2147483647.9999999)) "integer overflow") +(assert_return (invoke "i32.trunc_f64_s" (f64.const -2147483648.9)) (i32.const -2147483648)) +(assert_return (invoke "i32.trunc_f64_s" (f64.const 2147483647.9)) (i32.const 2147483647)) (assert_trap (invoke "i32.trunc_f64_s" (f64.const 2147483648.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_s" (f64.const -2147483649.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_s" (f64.const inf)) "integer overflow") @@ -145,6 +145,8 @@ (assert_return (invoke "i32.trunc_f64_u" (f64.const -0x1.ccccccccccccdp-1)) (i32.const 0)) (assert_return (invoke "i32.trunc_f64_u" (f64.const -0x1.fffffffffffffp-1)) (i32.const 0)) (assert_return (invoke "i32.trunc_f64_u" (f64.const 1e8)) (i32.const 100000000)) +(assert_return (invoke "i32.trunc_f64_u" (f64.const -0.9)) (i32.const 0)) +(assert_return (invoke "i32.trunc_f64_u" (f64.const 4294967295.9)) (i32.const 4294967295)) (assert_trap (invoke "i32.trunc_f64_u" (f64.const 4294967296.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_u" (f64.const -1.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_u" (f64.const 1e16)) "integer overflow")