diff --git a/collects/tests/typed-scheme/succeed/pr11887.rkt b/collects/tests/typed-scheme/succeed/pr11887.rkt new file mode 100644 index 00000000..5863f22e --- /dev/null +++ b/collects/tests/typed-scheme/succeed/pr11887.rkt @@ -0,0 +1,9 @@ +#lang typed/racket + +(define-struct: [e f] doll ((inside : (Option (doll e f))) + (elt1 : e) + (elt2 : f))) + +(: singleton (All (e f) (e f -> (doll e f)))) +(define (singleton e f) + (make-doll #f e f)) diff --git a/collects/typed-scheme/types/subtype.rkt b/collects/typed-scheme/types/subtype.rkt index 3f836bd5..1a9d26ab 100644 --- a/collects/typed-scheme/types/subtype.rkt +++ b/collects/typed-scheme/types/subtype.rkt @@ -6,6 +6,7 @@ (env type-name-env) (only-in (infer infer-dummy) unify) racket/match unstable/match + racket/function (rename-in racket/contract [-> c->] [->* c->*]) (for-syntax racket/base syntax/parse)) @@ -277,10 +278,10 @@ (fail! s t)] [((or (? Struct? s1) (NameStruct: s1)) (Base: _ _ _ _)) (fail! s t)] - ;; same for Null - [((Value: '()) (or (? Struct? s1) (NameStruct: s1))) + ;; same for all values. + [((Value: (? (negate struct?) _)) (or (? Struct? s1) (NameStruct: s1))) (fail! s t)] - [((or (? Struct? s1) (NameStruct: s1)) (Value: '())) + [((or (? Struct? s1) (NameStruct: s1)) (Value: (? (negate struct?) _))) (fail! s t)] ;; just checking if s/t is a struct misses recursive/union/etc cases [((? (lambda (_) (eq? ks 'struct))) (Base: _ _ _ _)) (fail! s t)]