From e3f56c8a259659a3b37b06a8bb09d57ec014ecc7 Mon Sep 17 00:00:00 2001 From: Alex Knauth Date: Thu, 7 Jul 2016 14:45:07 -0400 Subject: [PATCH] check for free-vars in types of casted-exprs (#384) --- .../typed-racket/base-env/prims-contract.rkt | 4 ++++ typed-racket-test/fail/cast-tyvar.rkt | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 typed-racket-test/fail/cast-tyvar.rkt diff --git a/typed-racket-lib/typed-racket/base-env/prims-contract.rkt b/typed-racket-lib/typed-racket/base-env/prims-contract.rkt index fc357bd3..2e7f0011 100644 --- a/typed-racket-lib/typed-racket/base-env/prims-contract.rkt +++ b/typed-racket-lib/typed-racket/base-env/prims-contract.rkt @@ -343,13 +343,17 @@ (define existing-ty-ctc (syntax-local-lift-expression (make-contract-def-rhs/from-typed existing-ty-id #f #f))) (define (store-existing-type existing-type) + (check-no-free-vars existing-type #'v) (cast-table-set! existing-ty-id (datum->syntax #f existing-type #'v))) (define (check-valid-type _) (define type (parse-type #'ty)) + (check-no-free-vars type #'ty)) + (define (check-no-free-vars type stx) (define vars (fv type)) ;; If there was an error don't create another one (unless (or (Error? type) (null? vars)) (tc-error/delayed + #:stx stx "Type ~a could not be converted to a contract because it contains free variables." type))) #`(#,(external-check-property #'#%expression check-valid-type) diff --git a/typed-racket-test/fail/cast-tyvar.rkt b/typed-racket-test/fail/cast-tyvar.rkt new file mode 100644 index 00000000..3fe37327 --- /dev/null +++ b/typed-racket-test/fail/cast-tyvar.rkt @@ -0,0 +1,11 @@ +#; +(exn-pred exn:fail:syntax? + #rx"Type \\(List X\\) could not be converted to a contract" + #rx"contains free variables" + #rx"10.8") + +#lang typed/racket +(: f : (All (X) (-> X X))) +(define (f x) + (cast (list x) Any) + x)