diff --git a/collects/tests/typed-racket/fail/pr13233-2.rkt b/collects/tests/typed-racket/fail/pr13233-2.rkt new file mode 100644 index 0000000000..4b4e1216ec --- /dev/null +++ b/collects/tests/typed-racket/fail/pr13233-2.rkt @@ -0,0 +1,15 @@ +#; +(exn:pred #rx"Expected Zero, but got (U Nonpositive-Integer Byte-Larger-Than-One Positive-Index-Not-Byte Positive-Fixnum-Not-Index Positive-Integer-Not-Fixnum)") +#lang typed/racket + +;; test odd? filter + +(: foo (Integer -> String)) +(define (foo n) + (if (odd? n) + "dummy" + (o n))) + +(: o (One -> String)) +(define (o x) "dummy") + diff --git a/collects/tests/typed-racket/fail/pr13233-3.rkt b/collects/tests/typed-racket/fail/pr13233-3.rkt new file mode 100644 index 0000000000..da8d1380d4 --- /dev/null +++ b/collects/tests/typed-racket/fail/pr13233-3.rkt @@ -0,0 +1,15 @@ +#; +(exn:pred #rx"Expected Zero, but got (U Negative-Integer Positive-Integer)") +#lang typed/racket + +;; test even? filter + +(: foo (Integer -> String)) +(define (foo n) + (if (even? n) + "dummy" + (z n))) + +(: z (Zero -> String)) +(define (z x) "dummy") + diff --git a/collects/tests/typed-racket/fail/pr13233-4.rkt b/collects/tests/typed-racket/fail/pr13233-4.rkt new file mode 100644 index 0000000000..e6eb235df3 --- /dev/null +++ b/collects/tests/typed-racket/fail/pr13233-4.rkt @@ -0,0 +1,15 @@ +#; +(exn:pred #rx"Expected One, but got (U Nonpositive-Integer Byte-Larger-Than-One Positive-Index-Not-Byte Positive-Fixnum-Not-Index Positive-Integer-Not-Fixnum)") +#lang typed/racket + +;; test even? filter + +(: foo (Integer -> String)) +(define (foo n) + (if (even? n) + (o n) + "dummy")) + +(: o (One -> String)) +(define (o x) "dummy") + diff --git a/collects/tests/typed-racket/fail/pr13233.rkt b/collects/tests/typed-racket/fail/pr13233.rkt new file mode 100644 index 0000000000..0810ae6f0d --- /dev/null +++ b/collects/tests/typed-racket/fail/pr13233.rkt @@ -0,0 +1,17 @@ +#; +(exn-pred "Expected Zero, but got") +#lang typed/racket + +;; test odd? filter + +(: foo (Integer -> Zero)) +(define (foo n) + (if (odd? n) + 0 + n)) + +(: ZERO Zero) +(define ZERO (foo 2)) + +ZERO + diff --git a/collects/typed-racket/base-env/base-env-numeric.rkt b/collects/typed-racket/base-env/base-env-numeric.rkt index 0cf1f4ed5a..6d2b9db15b 100644 --- a/collects/typed-racket/base-env/base-env-numeric.rkt +++ b/collects/typed-racket/base-env/base-env-numeric.rkt @@ -720,8 +720,8 @@ [exact-positive-integer? (make-pred-ty -Pos)] [exact-nonnegative-integer? (make-pred-ty -Nat)] -[odd? (-> -Int B : (-FS -top (-filter -Zero 0)))] -[even? (-> -Int B)] +[odd? (-> -Int B : (-FS (-not-filter -Zero 0) (-not-filter -One 0)))] +[even? (-> -Int B : (-FS (-not-filter -One 0) (-not-filter -Zero 0)))] [= (from-cases