diff --git a/typed-racket-lib/typed-racket/types/subtype.rkt b/typed-racket-lib/typed-racket/types/subtype.rkt index 8edf88d9..42c3e2f4 100644 --- a/typed-racket-lib/typed-racket/types/subtype.rkt +++ b/typed-racket-lib/typed-racket/types/subtype.rkt @@ -142,6 +142,10 @@ [(f f) A0] [((Bot:) t) A0] [(s (Top:)) A0] + [((TypeFilter: t1 p) (TypeFilter: t2 p)) + (subtype* A0 t1 t2)] + [((NotTypeFilter: t1 p) (NotTypeFilter: t2 p)) + (subtype* A0 t2 t1)] [(_ _) #f])) (define (subtypes/varargs args dom rst) diff --git a/typed-racket-test/unit-tests/subtype-tests.rkt b/typed-racket-test/unit-tests/subtype-tests.rkt index 016dc861..3f62de35 100644 --- a/typed-racket-test/unit-tests/subtype-tests.rkt +++ b/typed-racket-test/unit-tests/subtype-tests.rkt @@ -258,6 +258,15 @@ (-> Univ -Boolean : (-FS (-filter -Symbol 0) (-not-filter -Symbol 0))) (-> Univ -Boolean : (-FS (-filter -String 0) (-not-filter -String 0)))] + ;; subtyping for types inside filters + [(-> Univ -Boolean : (-FS (-filter -Symbol 0) (-not-filter -Symbol 0))) + (-> Univ -Boolean : (-FS (-filter (-opt -Symbol) 0) (-not-filter -Symbol 0)))] + [(-> Univ -Boolean : (-FS (-filter -Symbol 0) (-not-filter (-opt -Symbol) 0))) + (-> Univ -Boolean : (-FS (-filter -Symbol 0) (-not-filter -Symbol 0)))] + [FAIL + (-> Univ -Boolean : (-FS (-filter (-opt -Symbol) 0) (-not-filter (-opt -Symbol) 0))) + (-> Univ -Boolean : (-FS (-filter -Symbol 0) (-not-filter -Symbol 0)))] + [FAIL (make-ListDots (-box (make-F 'a)) 'a) (-lst (-box Univ))] [(make-ListDots (-> -Symbol (make-F 'a)) 'a) (-lst (-> -Symbol Univ))]