diff --git a/collects/tests/typed-scheme/unit-tests/typecheck-tests.ss b/collects/tests/typed-scheme/unit-tests/typecheck-tests.ss index b21e000bbc..8f48407f96 100644 --- a/collects/tests/typed-scheme/unit-tests/typecheck-tests.ss +++ b/collects/tests/typed-scheme/unit-tests/typecheck-tests.ss @@ -782,6 +782,11 @@ [gc : Number]) 'whatever)) #:ret (ret (-val 'whatever) (-FS (list) (list (make-Bot))))] + [tc-e (let: ([l : (Listof Any) (list 1 2 3)]) + (if (andmap number? l) + (+ 1 (car l)) + 7)) + -Number] ) (test-suite "check-type tests" diff --git a/collects/typed-scheme/private/base-env.ss b/collects/typed-scheme/private/base-env.ss index 27b75eb8fd..7824be3172 100644 --- a/collects/typed-scheme/private/base-env.ss +++ b/collects/typed-scheme/private/base-env.ss @@ -77,8 +77,9 @@ -Output-Port)] [read (->opt [-Input-Port] -Sexp)] [ormap (-polydots (a c b) (->... (list (->... (list a) (b b) c) (-lst a)) ((-lst b) b) c))] -[andmap (-polydots (a c b) (cl->* - ;(make-pred-ty (list (make-pred-ty (list a) B d) (-lst a)) B (-lst d)) +[andmap (-polydots (a c d b) (cl->* + ;; 1 means predicate on second argument + (make-pred-ty (list (make-pred-ty (list a) c d) (-lst a)) c (-lst d) 1) (->... (list (->... (list a) (b b) c) (-lst a)) ((-lst b) b) c)))] [newline (->opt [-Output-Port] -Void)] [not (-> Univ B)] diff --git a/collects/typed-scheme/typed-scheme.ss b/collects/typed-scheme/typed-scheme.ss index fd719d3e0d..0e1b5832eb 100644 --- a/collects/typed-scheme/typed-scheme.ss +++ b/collects/typed-scheme/typed-scheme.ss @@ -128,7 +128,7 @@ body2] [_ (let ([ty-str (match type [(tc-result1: (? (lambda (t) (type-equal? t -Void)))) #f] - [(tc-result1: t) + [(tc-result1: t f o) (format "- : ~a\n" t)] [(tc-results: t) (format "- : ~a\n" (cons 'Values t))] diff --git a/collects/typed-scheme/types/abbrev.ss b/collects/typed-scheme/types/abbrev.ss index 8d14141608..9b1266dfc8 100644 --- a/collects/typed-scheme/types/abbrev.ss +++ b/collects/typed-scheme/types/abbrev.ss @@ -252,11 +252,14 @@ (d/c make-pred-ty (case-> (c:-> Type/c Type/c) - (c:-> (listof Type/c) Type/c Type/c Type/c)) + (c:-> (listof Type/c) Type/c Type/c Type/c) + (c:-> (listof Type/c) Type/c Type/c integer? Type/c)) (case-lambda + [(in out t n) + (->* in out : (-LFS (list (-filter t null n)) (list (-not-filter t null n))))] [(in out t) - (->* in out : (-LFS (list (-filter t)) (list (-not-filter t))))] - [(t) (make-pred-ty (list Univ) -Boolean t)])) + (make-pred-ty in out t 0)] + [(t) (make-pred-ty (list Univ) -Boolean t 0)])) (define true-filter (-FS (list) (list (make-Bot)))) (define false-filter (-FS (list (make-Bot)) (list)))