diff --git a/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt b/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt index fac22f1e..7da48d8e 100644 --- a/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt @@ -889,12 +889,14 @@ ;; numeric predicates ;; There are 25 values that answer true to zero?. They are either reals, or inexact complexes. +;; Note -RealZero contains NaN and zero? returns #f on it [zero? (cl->* (-> -ExactNumber B : (-FS (-filter (-val 0) 0) (-not-filter (-val 0) 0))) - (-> -Real B : (-FS (-filter -RealZero 0) (-not-filter -RealZero 0))) + (-> -Real B : (-FS (-filter -RealZero 0) + (-not-filter (Un -Zero -InexactRealPosZero -InexactRealNegZero) 0))) (-> N B : (-FS (-filter (Un -RealZero -InexactComplex -InexactImaginary) 0) - (-not-filter -RealZero 0))))] + (-not-filter (Un -Zero -InexactRealPosZero -InexactRealNegZero) 0))))] [number? (make-pred-ty N)] [integer? (asym-pred Univ B (-FS (-filter (Un -Int -Flonum -SingleFlonum) 0) ; inexact-integers exist... diff --git a/typed-racket-test/unit-tests/typecheck-tests.rkt b/typed-racket-test/unit-tests/typecheck-tests.rkt index 9d8d0123..e42019ef 100644 --- a/typed-racket-test/unit-tests/typecheck-tests.rkt +++ b/typed-racket-test/unit-tests/typecheck-tests.rkt @@ -3562,6 +3562,9 @@ (error "foo")) #:extend-env ([foo-x (t:-> (-prefab 'foo -String) -String)]) #:msg #rx"expected: \\(Prefab foo.*given: \\(Prefab bar"] + [tc-e/t + (lambda: ([x : Real-Zero]) (or (zero? x) x)) + (t:-> -RealZero (t:Un (-val #t) -InexactRealNan) : -true-filter)] ) (test-suite