diff --git a/collects/tests/typed-scheme/succeed/member-pred.ss b/collects/tests/typed-scheme/succeed/member-pred.ss new file mode 100644 index 00000000..20d3b987 --- /dev/null +++ b/collects/tests/typed-scheme/succeed/member-pred.ss @@ -0,0 +1,8 @@ +#lang typed/scheme + +(: foo : Any -> (U 'x 'y)) + +(define (foo x) + (if (member x '(x y)) + x + 'x)) diff --git a/collects/typed-scheme/typecheck/tc-app.ss b/collects/typed-scheme/typecheck/tc-app.ss index 89a37e48..fe5522df 100644 --- a/collects/typed-scheme/typecheck/tc-app.ss +++ b/collects/typed-scheme/typecheck/tc-app.ss @@ -32,11 +32,10 @@ ;; comparators that inform the type system (define-syntax-class comparator - #:literals (eq? equal? eqv? = string=? symbol=?) - (pattern eq?) (pattern equal?) (pattern eqv?) (pattern =) (pattern string=?) (pattern symbol=?)) + #:literals (eq? equal? eqv? = string=? symbol=? memq member) + (pattern eq?) (pattern equal?) (pattern eqv?) (pattern =) (pattern string=?) (pattern symbol=?) (pattern member)) ;; typecheck eq? applications -;; identifier identifier expression expression expression ;; identifier expr expr -> tc-results (define (tc/eq comparator v1 v2) (define (ok? val) @@ -52,6 +51,15 @@ (ret -Boolean (apply-filter (make-LFilterSet (list (make-LTypeFilter (-val val) null 0)) (list (make-LNotTypeFilter (-val val) null 0))) t o))] [((tc-result1: (Value: (? ok? val))) (tc-result1: t _ o)) (ret -Boolean (apply-filter (make-LFilterSet (list (make-LTypeFilter (-val val) null 0)) (list (make-LNotTypeFilter (-val val) null 0))) t o))] + [((tc-result1: t _ o) + (and (? (lambda _ (free-identifier=? #'member comparator))) + (tc-result1: (app untuple (list ts ...))))) + (let ([ty (apply Un ts)]) + (ret -Boolean + (apply-filter + (make-LFilterSet (list (make-LTypeFilter ty null 0)) + (list (make-LNotTypeFilter ty null 0))) + t o)))] [(_ _) (ret -Boolean)]))