diff --git a/collects/tests/typed-racket/succeed/pr11390.rkt b/collects/tests/typed-racket/succeed/pr11390.rkt new file mode 100644 index 0000000000..20397bf6bf --- /dev/null +++ b/collects/tests/typed-racket/succeed/pr11390.rkt @@ -0,0 +1,22 @@ +#lang typed/racket + +;Doesn't TypeCheck +(struct: foo ()) +(struct: foo-num foo ((v : Number))) +(struct: foo-str foo ((v : String))) + +#| +;TypeChecks +(struct: foo-num ((v : Number))) +(struct: foo-str ((v : String))) +|# + + +(: extract-foo (case-lambda + (foo-num -> Number) + (foo-str -> String))) + +(define (extract-foo foo) + (cond + ((foo-num? foo) (foo-num-v foo)) + ((foo-str? foo) (foo-str-v foo)))) diff --git a/collects/typed-racket/types/remove-intersect.rkt b/collects/typed-racket/types/remove-intersect.rkt index bbf00415e4..a0564e5fa1 100644 --- a/collects/typed-racket/types/remove-intersect.rkt +++ b/collects/typed-racket/types/remove-intersect.rkt @@ -80,16 +80,9 @@ [(list (Struct: n #f flds _ _ _ _ _) (StructTop: (Struct: n* #f flds* _ _ _ _ _))) #f] - [(list (and t1 (Struct: n p flds _ _ _ _ _)) - (and t2 (Struct: n* p* flds* _ _ _ _ _))) - (let ([p1 (if (Name? p) (resolve-name p) p)] - [p2 (if (Name? p*) (resolve-name p*) p*)]) - (or (and p2 (overlap t1 p2)) - (and p1 (overlap t2 p1)) - (and (= (length flds) (length flds*)) - (for/and ([f flds] [f* flds*]) - (match* (f f*) - [((fld: t _ _) (fld: t* _ _)) (overlap t t*)])))))] + [(list (and t1 (Struct: _ _ _ _ _ _ _ _)) + (and t2 (Struct: _ _ _ _ _ _ _ _))) + (or (subtype t1 t2) (subtype t2 t1))] [(list (== (-val eof)) (Function: _)) #f]