diff --git a/collects/tests/typed-racket/fail/pr13448.rkt b/collects/tests/typed-racket/fail/pr13448.rkt new file mode 100644 index 0000000000..d3ebfd0265 --- /dev/null +++ b/collects/tests/typed-racket/fail/pr13448.rkt @@ -0,0 +1,7 @@ +#lang typed/racket +(: foo + (case-> + (Number -> Number) + (Number String -> Number) + (Number String String * -> Number))) +(define (foo x (s1 "") . s) x) diff --git a/collects/typed-racket/types/kw-types.rkt b/collects/typed-racket/types/kw-types.rkt index b204773ae3..66baf62f76 100644 --- a/collects/typed-racket/types/kw-types.rkt +++ b/collects/typed-racket/types/kw-types.rkt @@ -56,9 +56,16 @@ (make-Function (list (make-arr* ts rng #:rest rest #:drest drest))))) (define (prefix-of a b) + (define (rest-equal? a b) + (match* (a b) + [(#f #f) #t] + [(#f _) #f] + [(_ #f) #f] + [(a b) (type-equal? a b)])) (define (drest-equal? a b) (match* (a b) [((list t b) (list t* b*)) (and (type-equal? t t*) (equal? b b*))] + [(#f #f) #t] [(_ _) #f])) (define (kw-equal? a b) (and (equal? (length a) (length b)) @@ -68,10 +75,10 @@ [((arr: args result rest drest kws) (arr: args* result* rest* drest* kws*)) (and (< (length args) (length args*)) - (or (equal? rest rest*) (type-equal? rest rest*)) - (or (equal? drest drest*) (drest-equal? drest drest*)) + (rest-equal? rest rest*) + (drest-equal? drest drest*) (type-equal? result result*) - (or (equal? kws kws*) (kw-equal? kws kws*)) + (kw-equal? kws kws*) (for/and ([p args] [p* args*]) (type-equal? p p*)))]))