Fix send on a receiver with recursive type

Thanks to Matthias for finding the bug
This commit is contained in:
Asumu Takikawa 2015-10-19 14:58:27 -04:00
parent 638618ae40
commit 3149b0a305
2 changed files with 14 additions and 2 deletions

View File

@ -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)

View File

@ -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]))