diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt index d703ceef..17609040 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt @@ -1178,7 +1178,7 @@ (-> -Byte -PosInt B : (-FS (-and (-filter -PosByte 0) (-filter -PosByte 1)) -top)) (-> -Byte -PosReal B : (-FS (-filter -PosByte 0) -top)) (-> -PosInt -Byte B : (-FS -top (-and (-filter -PosByte 0) (-filter -PosByte 1)))) - (-> -PosRat -Byte B : (-FS -top (-filter -PosByte 0))) + (-> -PosRat -Byte B : (-FS -top (-filter -PosByte 1))) (-> -Byte -Nat B : (-FS (-filter -Byte 1) -top)) (-> -Nat -Byte B : (-FS -top (-and (-filter -Byte 0) (-filter -PosByte 1)))) (-> -NonNegRat -Byte B : (-FS -top (-filter -PosByte 1))) diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/fail/pr14568.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/fail/pr14568.rkt new file mode 100644 index 00000000..1c8488bf --- /dev/null +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/fail/pr14568.rkt @@ -0,0 +1,20 @@ +#; +(exn-pred 1) +#lang typed/racket + +(: rational->fle (-> Exact-Rational (Values Flonum Flonum))) +(define (rational->fle r) + (let-values ([(s r) (values (sgn r) (abs r))]) + (define e + (- (integer-length (numerator r)) + (integer-length (denominator r)))) + (let loop ([r (/ r (expt 2 e))] [e e]) + (cond [(< r 1) (loop (* r 2) (- e 1))] + [(>= r 2) (loop (/ r 2) (+ e 1))] + [else + (ann r Positive-Byte) ; should not typecheck + (values (* (real->double-flonum s) + (real->double-flonum r)) ; optimizer changes to ->fl + (real->double-flonum e))])))) + +(rational->fle 1/7) ; optimization causes contract violation diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr14568.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr14568.rkt new file mode 100644 index 00000000..14b0fa9e --- /dev/null +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr14568.rkt @@ -0,0 +1,18 @@ +#lang typed/racket + +(: rational->fle (-> Exact-Rational (Values Flonum Flonum))) +(define (rational->fle r) + (let-values ([(s r) (values (sgn r) (abs r))]) + (define e + (- (integer-length (numerator r)) + (integer-length (denominator r)))) + (let loop ([r (/ r (expt 2 e))] [e e]) + (cond [(< r 1) (loop (* r 2) (- e 1))] + [(>= r 2) (loop (/ r 2) (+ e 1))] + [else + ;; (ann r Positive-Byte) ; wrongly typechecks + (values (* (real->double-flonum s) + (real->double-flonum r)) ; optimizer changes to ->fl + (real->double-flonum e))])))) + +(rational->fle 1/7) ; optimization causes contract violation