diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index 92cf898257..551597f8ab 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -6300,6 +6300,18 @@ (lambda () (list-cmp348))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Make sure conversion to internal `with-immediate-continuation-mark` +;; correctly handles mutable variables + +(test #f + 'wicm + (call-with-immediate-continuation-mark + 'hello + (lambda (m) + (set! m m) + m))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/resolve.c b/racket/src/racket/src/resolve.c index f4b06fed85..23d62a1ea2 100644 --- a/racket/src/racket/src/resolve.c +++ b/racket/src/racket/src/resolve.c @@ -778,6 +778,16 @@ with_immed_mark_resolve(Scheme_Object *data, Resolve_Info *orig_rslv) var->resolve.lex_depth = rslv->current_lex_depth; e = resolve_expr(SCHEME_CDR(wcm->body), rslv); + + if (var->mutated) { + Scheme_Object *bcode; + bcode = scheme_alloc_object(); + bcode->type = scheme_boxenv_type; + SCHEME_PTR1_VAL(bcode) = scheme_make_integer(0); + SCHEME_PTR2_VAL(bcode) = e; + e = bcode; + } + wcm->body = e; merge_resolve(orig_rslv, rslv);