diff --git a/typed-racket-lib/typed-racket/typecheck/tc-send.rkt b/typed-racket-lib/typed-racket/typecheck/tc-send.rkt index a221e572..0b6cc5d1 100644 --- a/typed-racket-lib/typed-racket/typecheck/tc-send.rkt +++ b/typed-racket-lib/typed-racket/typecheck/tc-send.rkt @@ -49,7 +49,9 @@ "send: type mismatch" "expected" "an object" "given" rcvr-type)])) - (define final-ret (do-check (tc-expr/t rcvr))) + ;; Make sure to resolve before `do-check` because the type might + ;; be a Name type or recursive type and thus unable to match Instance: + (define final-ret (do-check (resolve (tc-expr/t rcvr)))) (add-typeof-expr form final-ret) final-ret) diff --git a/typed-racket-test/unit-tests/class-tests.rkt b/typed-racket-test/unit-tests/class-tests.rkt index 2aa41b09..c28266e4 100644 --- a/typed-racket-test/unit-tests/class-tests.rkt +++ b/typed-racket-test/unit-tests/class-tests.rkt @@ -2083,4 +2083,14 @@ (: get-a (-> String)) (define/public (get-a) a))) (error "foo")) - #:msg #rx"expected: String.*given: Integer"])) + #:msg #rx"expected: String.*given: Integer"] + ;; Make sure `send` works on a recursively typed object + [tc-e (let () + (: o (Rec X (Object [m (-> Void)] [n (-> X Void)]))) + (define o + (make-object (class object% + (super-new) + (define/public (m) (void)) + (define/public (n x) (void))))) + (send o m)) + -Void]))