diff --git a/pkgs/racket-test-core/tests/racket/macro.rktl b/pkgs/racket-test-core/tests/racket/macro.rktl index 33f6fadd34..16eb9e4eea 100644 --- a/pkgs/racket-test-core/tests/racket/macro.rktl +++ b/pkgs/racket-test-core/tests/racket/macro.rktl @@ -1564,6 +1564,19 @@ (regexp-match? #rx"cannot use identifier tainted by macro transformation" (exn-message exn)))) +;; ---------------------------------------- +;; Check that lifting works right at the top level: + +(module macro-that-introduces-a-lifted-one racket + (define-syntax (m stx) + (syntax-local-lift-expression #'1)) + (m)) +(dynamic-require ''macro-that-introduces-a-lifted-one #f) + +(test 1 values (parameterize ([current-namespace + (module->namespace ''macro-that-introduces-a-lifted-one)]) + (eval '(values m)))) + ;; ---------------------------------------- (report-errs) diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index db0e5d97ef..ef742fff15 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -2088,6 +2088,18 @@ scheme_do_local_lift_expr(const char *who, int stx_pos, int argc, Scheme_Object if (env->genv->stx_context) id = scheme_stx_introduce_to_module_context(id, env->genv->stx_context); + if (env->flags & SCHEME_TMP_TL_BIND_FRAME) { + /* When the lifetd definition is compiled, `tmp_bind_scope` will + be added to the defined name so that a fresh binding is not + created. We have added a fresh scope that would keep it + distinct, anyway, but add the tmp scope here to keep the + definition and reference in sync. */ + if (!env->genv->tmp_bind_scope) { + id_sym = scheme_new_scope(SCHEME_STX_MODULE_SCOPE); + env->genv->tmp_bind_scope = id_sym; + } + id = scheme_stx_add_scope(id, env->genv->tmp_bind_scope, scheme_env_phase(env->genv)); + } rev_ids = scheme_make_pair(id, rev_ids); }