diff --git a/pkgs/racket-test-core/tests/racket/read.rktl b/pkgs/racket-test-core/tests/racket/read.rktl index 93aa392983..d5264163bc 100644 --- a/pkgs/racket-test-core/tests/racket/read.rktl +++ b/pkgs/racket-test-core/tests/racket/read.rktl @@ -522,6 +522,14 @@ (lambda (x) (and (vector? x) (eq? (vector-ref x 0) (vector-ref x 1)))) #2((1 2))) +;; Immutable vectors and boxes from `read-syntax` +(test #t immutable? (syntax-e (read-syntax #f (open-input-string "#(a b c)")))) +(test #t immutable? (syntax-e (read-syntax #f (open-input-string "#5(a b c)")))) +(test #t immutable? (syntax-e (read-syntax #f (open-input-string "#&a")))) +(test #f immutable? (read (open-input-string "#(a b c)"))) +(test #f immutable? (read (open-input-string "#5(a b c)"))) +(test #f immutable? (read (open-input-string "#&a"))) + (define (graph-error-tests readstr graph-ok?) (err/rt-test (readstr "#0#") exn:fail:read?) (err/rt-test (readstr "#0=#0#") exn:fail:read?) diff --git a/racket/src/expander/read/box.rkt b/racket/src/expander/read/box.rkt index 58c295ef35..601925d4e3 100644 --- a/racket/src/expander/read/box.rkt +++ b/racket/src/expander/read/box.rkt @@ -17,4 +17,7 @@ (reader-error in config #:due-to e #:end-pos open-end-pos "expected an element for `~a&` box, found end-of-file" dispatch-c)) - (wrap (box e) in config #f)) + (wrap (if (read-config-for-syntax? config) + (box-immutable e) + (box e)) + in config #f)) diff --git a/racket/src/expander/read/vector.rkt b/racket/src/expander/read/vector.rkt index fcf73d11ba..d8dd220869 100644 --- a/racket/src/expander/read/vector.rkt +++ b/racket/src/expander/read/vector.rkt @@ -75,7 +75,9 @@ (flvector-set! vec i e))]) vec])])) - (wrap vec + (wrap (if (read-config-for-syntax? config) + (vector->immutable-vector vec) + vec) in config opener)) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index b3ac66e158..3bec2d763a 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -56009,7 +56009,11 @@ static const char *startup_source = "(void)))" "(let-values()(void))))))" " vec_0))))))))))))" -"(wrap vec_0 in_0 config_0 opener_0))))))))))))))))" +"(wrap" +"(if(read-config-for-syntax? config_0)(vector->immutable-vector vec_0) vec_0)" +" in_0" +" config_0" +" opener_0))))))))))))))))" "(define-values" "(read-fixnum-or-flonum-vector)" "(lambda(read-one_0 dispatch-c_0 c_0 c2_0 in_0 config_0)" @@ -58409,7 +58413,7 @@ static const char *startup_source = " temp9_0" "(list dispatch-c10_0))))" "(void))" -"(wrap(box e_0) in_0 config_0 #f))))))))" +"(wrap(if(read-config-for-syntax? config_0)(box-immutable e_0)(box e_0)) in_0 config_0 #f))))))))" "(define-values" "(read-regexp)" "(lambda(mode-c_0 accum-str_0 in_0 config_0)"