Fix occurrence typing when comparing Byte and Positive-Rationa.
Closes PR14568. original commit: 8b6d3e9117667ccd5cdde9dabea0c2a843e7fb63
This commit is contained in:
parent
2170e9f6d6
commit
97ac1da181
|
@ -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)))
|
||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue
Block a user