From 8a7852ebbfeb85a8f860700ba5ae481ed7aa9b41 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 15 Dec 2016 07:22:09 -0700 Subject: [PATCH] fix re-expansion of a simple `#%module-body` form with submodules Closes #1538 --- .../racket-test-core/tests/racket/module.rktl | 32 +++++++++++++++++++ racket/src/racket/src/module.c | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index 28ffe625c7..0f5c3cf4f5 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -1905,6 +1905,38 @@ case of module-leve bindings; it doesn't cover local bindings. (namespace-syntax-introduce (dynamic-require ''provide-the-x-identifier 'x-id)))))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Make sure that re-expansion of a simple (in the sense of `require` +;; information kept for `module->namspace`) module body is ok + +(module m racket/base + (module mylang racket/base + (require (for-syntax racket/base)) + (provide (rename-out [-#%module-begin #%module-begin])) + (define-syntax (-#%module-begin stx) + (syntax-case stx () + [(_ lng . rest) + (with-syntax ([#%module-begin (datum->syntax #'lng '#%module-begin)]) + #`(#%plain-module-begin + (require lng) + (continue #%module-begin . rest)))])) + (define-syntax (continue stx) + (syntax-case stx () + [(_ lang-module-begin . rest) + (let ([body-stx (local-expand + #'(lang-module-begin . rest) + 'module-begin + (list))]) + (syntax-case body-stx (#%plain-module-begin) + [(#%plain-module-begin . mod-body) + #`(begin . mod-body)]))]))) + + (module foo (submod ".." mylang) racket/base + (module a-submod racket/base + (define x 1) + (provide x)) + (require 'a-submod))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 17d3e7dac8..e307c597a0 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -8778,7 +8778,7 @@ static Scheme_Object *do_module_begin(Scheme_Object *orig_form, Scheme_Comp_Env } } - if (*all_simple_bindings && env->genv->module->rn_stx) { + if (*all_simple_bindings && env->genv->module->rn_stx && rec[drec].comp) { /* We will be able to reconstruct binding for `module->namespace`: */ env->genv->module->rn_stx = scheme_true; } else {