diff --git a/pkgs/racket-test/tests/racket/contract/prof.rkt b/pkgs/racket-test/tests/racket/contract/prof.rkt index 7e19329674..793c9aab08 100644 --- a/pkgs/racket-test/tests/racket/contract/prof.rkt +++ b/pkgs/racket-test/tests/racket/contract/prof.rkt @@ -210,4 +210,14 @@ '(let () ((contract (case-> (-> neg-blame? any/c)) (λ (x) x) 'pos 'neg) - 1)))) + 1))) + + (test/spec-passed + 'provide/contract23 + '(unbox (contract (box/c neg-blame?) (box 1) 'pos 'neg))) + + (test/spec-passed + 'provide/contract24 + '(set-box! (contract (box/c neg-blame?) (box 1) 'pos 'neg) 2)) + + ) diff --git a/racket/collects/racket/contract/private/box.rkt b/racket/collects/racket/contract/private/box.rkt index e88d576cd1..8ec39c9fea 100644 --- a/racket/collects/racket/contract/private/box.rkt +++ b/racket/collects/racket/contract/private/box.rkt @@ -141,6 +141,7 @@ (define pos-elem-r-proj (r-vfp box-blame)) (define neg-elem-w-proj (w-vfp (blame-swap box-blame))) (λ (val neg-party) + (define blame+neg-party (cons blame neg-party)) (cond [(check-box/c-np ctc val blame) => @@ -150,8 +151,14 @@ (box-immutable (pos-elem-r-proj (unbox val) neg-party)) (chaperone/impersonate-box val - (λ (b v) (pos-elem-r-proj v neg-party)) - (λ (b v) (neg-elem-w-proj v neg-party)) + (λ (b v) + (with-contract-continuation-mark + blame+neg-party + (pos-elem-r-proj v neg-party))) + (λ (b v) + (with-contract-continuation-mark + blame+neg-party + (neg-elem-w-proj v neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame (blame-add-missing-party blame neg-party)))])))))