22 lines
685 B
Racket
22 lines
685 B
Racket
#lang racket/base
|
|
(module untyped racket/base
|
|
(provide f)
|
|
(define (f x) x))
|
|
(module typed typed/racket
|
|
(require typed/rackunit)
|
|
(struct (X) s ([i : X]) #:mutable #:transparent)
|
|
(require/typed (submod ".." untyped)
|
|
[f (-> Any (s (U Integer String)))])
|
|
(: s1 : (s Integer))
|
|
(define s1 (s 42))
|
|
(define s2 (ann s1 Any))
|
|
(define s3 (f s2))
|
|
(check-equal? (s-i s1) 42)
|
|
(check-equal? (s-i s3) 42)
|
|
(check-exn #rx"Attempted to use a higher-order value passed as `Any`"
|
|
(λ () (set-s-i! s3 "hi")))
|
|
(check-equal? (s-i s1) 42
|
|
"if the previous test hadn't errored, this would be \"hi\" with type Integer")
|
|
)
|
|
(require 'typed)
|