diff --git a/collects/typed-scheme/private/base-env-numeric.rkt b/collects/typed-scheme/private/base-env-numeric.rkt index dd708b0b..cb561075 100644 --- a/collects/typed-scheme/private/base-env-numeric.rkt +++ b/collects/typed-scheme/private/base-env-numeric.rkt @@ -53,7 +53,7 @@ [rational? (make-pred-ty -Real)] [exact? (asym-pred N B (-FS -top (-not-filter -ExactRational 0)))] [inexact? (asym-pred N B (-FS -top (-not-filter -Flonum 0)))] -[fixnum? (asym-pred Univ B (-FS (-filter -Integer 0) -top))] +[fixnum? (make-pred-ty -Fixnum)] [positive? (-> -Real B)] [negative? (-> -Real B)] [exact-positive-integer? (make-pred-ty -Pos)] diff --git a/collects/typed-scheme/typecheck/tc-app.rkt b/collects/typed-scheme/typecheck/tc-app.rkt index a03531ff..95707e7f 100644 --- a/collects/typed-scheme/typecheck/tc-app.rkt +++ b/collects/typed-scheme/typecheck/tc-app.rkt @@ -599,11 +599,12 @@ [_ (int-err "bad expected: ~a" expected)])] ;; special case for `-' used like `sub1' [(#%plain-app (~and op (~literal -)) v (~and arg2 ((~literal quote) 1))) - (add-typeof-expr #'arg2 (ret -Nat)) + (add-typeof-expr #'arg2 (ret -PositiveFixnum)) (match-let ([(tc-result1: t) (single-value #'v)]) - (if (subtype t -ExactPositiveInteger) - (ret -Nat) - (tc/funapp #'op #'(v arg2) (single-value #'op) (list (ret t) (single-value #'arg2)) expected)))] + (cond + [(subtype t (Un -Zero -PositiveFixnum)) (ret -Fixnum)] + [(subtype t -ExactPositiveInteger) (ret -Nat)] + [else (tc/funapp #'op #'(v arg2) (single-value #'op) (list (ret t) (single-value #'arg2)) expected)]))] ;; call-with-values [(#%plain-app call-with-values prod con) (match (tc/funapp #'prod #'() (single-value #'prod) null #f)