diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index 1bdc19931e..eab7c529b6 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -1827,6 +1827,33 @@ case of module-leve bindings; it doesn't cover local bindings. (dynamic-require ''rexports-values-from-kernel 'f) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check that shifts associated with re-expansion are +;; properly tracked for `module->namespace` + +(parameterize ([current-load-relative-directory + (let-values ([(b n dir?) + (split-path + (collection-file-path "promise.rkt" "racket"))]) + b)]) + (let* ([e (expand (namespace-syntax-introduce + (datum->syntax #f '(module m racket/base + ;; A prefixed import forces saving of the + ;; context as a syntax object in marshaled + ;; form: + (require (prefix-in p: "promise.rkt"))))))] + [c (compile e)] + [o (open-output-bytes)] + [_ (write c o)] + [r (parameterize ([read-accept-compiled #t]) + (read (open-input-bytes (get-output-bytes o))))]) + (parameterize ([current-namespace (make-base-namespace)]) + (eval r) + (dynamic-require ''m #f) + (parameterize ([current-namespace (module->namespace ''m)]) + (and (memq 'p:force (namespace-mapped-symbols)) + #t))))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 2b742705b1..31b3696db6 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -7601,6 +7601,12 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env, /* phase shift to replace self_modidx of previous expansion: */ fm = scheme_stx_shift(fm, NULL, this_empty_self_modidx, self_modidx, NULL, m->insp, m->insp); + if (m->ii_src) { + /* shift the initial import to record the chain for rn_stx */ + ii = scheme_stx_shift(m->ii_src, NULL, this_empty_self_modidx, self_modidx, NULL, + m->insp, m->insp); + m->ii_src = ii; + } fm = scheme_stx_add_module_frame_context(fm, rn_set);