diff --git a/typed-racket-lib/typed-racket/infer/infer-unit.rkt b/typed-racket-lib/typed-racket/infer/infer-unit.rkt index 9cf883bb..ec5e7ed8 100644 --- a/typed-racket-lib/typed-racket/infer/infer-unit.rkt +++ b/typed-racket-lib/typed-racket/infer/infer-unit.rkt @@ -381,11 +381,15 @@ (define s-seq (seq ss (rest->end s-rest))) (define t-seq (seq ts (rest->end t-rest))) - (and (null? s-kws) - (null? t-kws) - (% cset-meet - (cgen context s t) - (cgen/seq context t-seq s-seq)))])) + (and + ;; if all keywords are optional, then we can just treat + ;; them like they aren't there (or if there are none) + (for/and ([s-kw (in-list s-kws)]) + (not (Keyword-required? s-kw))) + (null? t-kws) + (% cset-meet + (cgen context s t) + (cgen/seq context t-seq s-seq)))])) (define/cond-contract (cgen/flds context flds-s flds-t) (context? (listof fld?) (listof fld?) . -> . (or/c #f cset?)) diff --git a/typed-racket-test/unit-tests/typecheck-tests.rkt b/typed-racket-test/unit-tests/typecheck-tests.rkt index 69570e99..870b555e 100644 --- a/typed-racket-test/unit-tests/typecheck-tests.rkt +++ b/typed-racket-test/unit-tests/typecheck-tests.rkt @@ -4204,6 +4204,11 @@ [else 42])) (void)) -Void] + [tc-e (map string-trim (ann '("a" "b") (Listof String))) + (-lst -String)] + [tc-err (let () + (define (f #:x x y) 1) + (map f (list 1 2 3)))] ) (test-suite