Mutable data at typed boundaries can't have flat contracts.
Closes PR 12884.
This commit is contained in:
parent
546c12cf2a
commit
f40c7f11a6
13
collects/tests/typed-racket/fail/predicate-box.rkt
Normal file
13
collects/tests/typed-racket/fail/predicate-box.rkt
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#lang typed/racket
|
||||||
|
|
||||||
|
(define: b : (Boxof Any) (box 4))
|
||||||
|
|
||||||
|
(define-predicate boxof-integer? (Boxof Integer))
|
||||||
|
|
||||||
|
(define (set-b-box! v) (set-box! b v))
|
||||||
|
|
||||||
|
(: a-very-listy-integer (-> Integer))
|
||||||
|
(define (a-very-listy-integer)
|
||||||
|
(cond [(boxof-integer? b) (set-b-box! '(1 2 3))
|
||||||
|
(unbox b)]
|
||||||
|
[else (error 'a-very-listy-integer "can't happen")]))
|
|
@ -188,13 +188,11 @@
|
||||||
[(Set: t) #`(set/c #,(t->c t))]
|
[(Set: t) #`(set/c #,(t->c t))]
|
||||||
[(Sequence: ts) #`(sequence/c #,@(map t->c ts))]
|
[(Sequence: ts) #`(sequence/c #,@(map t->c ts))]
|
||||||
[(Vector: t)
|
[(Vector: t)
|
||||||
(if flat?
|
(when flat? (exit (fail)))
|
||||||
#`(vectorof #,(t->c t #:flat #t) #:flat? #t)
|
#`(vectorof #,(t->c t))]
|
||||||
#`(vectorof #,(t->c t)))]
|
|
||||||
[(Box: t)
|
[(Box: t)
|
||||||
(if flat?
|
(when flat? (exit (fail)))
|
||||||
#`(box/c #,(t->c t #:flat #t) #:flat? #t)
|
#`(box/c #,(t->c t))]
|
||||||
#`(box/c #,(t->c t)))]
|
|
||||||
[(Pair: t1 t2)
|
[(Pair: t1 t2)
|
||||||
#`(cons/c #,(t->c t1) #,(t->c t2))]
|
#`(cons/c #,(t->c t1) #,(t->c t2))]
|
||||||
[(Opaque: p? cert)
|
[(Opaque: p? cert)
|
||||||
|
@ -238,6 +236,8 @@
|
||||||
=>
|
=>
|
||||||
cdr]
|
cdr]
|
||||||
[proc (exit (fail))]
|
[proc (exit (fail))]
|
||||||
|
[(and flat? (ormap values mut?))
|
||||||
|
(exit (fail))]
|
||||||
[poly?
|
[poly?
|
||||||
(with-syntax* ([(rec blame val) (generate-temporaries '(rec blame val))]
|
(with-syntax* ([(rec blame val) (generate-temporaries '(rec blame val))]
|
||||||
[maker maker-id]
|
[maker maker-id]
|
||||||
|
@ -283,9 +283,8 @@
|
||||||
[(Value: v) #`(flat-named-contract #,(format "~a" v) (lambda (x) (equal? x '#,v)))]
|
[(Value: v) #`(flat-named-contract #,(format "~a" v) (lambda (x) (equal? x '#,v)))]
|
||||||
[(Param: in out) #`(parameter/c #,(t->c out))]
|
[(Param: in out) #`(parameter/c #,(t->c out))]
|
||||||
[(Hashtable: k v)
|
[(Hashtable: k v)
|
||||||
(if flat?
|
(when flat? (exit (fail)))
|
||||||
#`(hash/c #,(t->c k #:flat #t) #,(t->c v #:flat #t) #:flat? #t #:immutable 'dont-care)
|
#`(hash/c #,(t->c k) #,(t->c v) #:immutable 'dont-care)]
|
||||||
#`(hash/c #,(t->c k) #,(t->c v) #:immutable 'dont-care))]
|
|
||||||
[else
|
[else
|
||||||
(exit (fail))]))))
|
(exit (fail))]))))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user