diff --git a/collects/tests/mzscheme/module.ss b/collects/tests/mzscheme/module.ss index fb30aa57be..11f7115451 100644 --- a/collects/tests/mzscheme/module.ss +++ b/collects/tests/mzscheme/module.ss @@ -455,6 +455,49 @@ (test '#(tests/mzscheme/lang/getinfo get-info closure-data) module->language-info 'tests/mzscheme/langm)))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check shadowing of initial imports: + +(let ([m-code '(module m scheme/base (define-syntax-rule (lambda . _) 5) (provide lambda))] + [n-code '(module n scheme/base + (require 'm) + (define five (lambda (x) x)) + (define five-stx #'lambda) + (provide five five-stx))] + [p-code '(module p scheme/base + (require 'n) + (define same? (free-identifier=? #'lambda five-stx)) + (provide same?))]) + (let ([ns (make-base-namespace)]) + (eval m-code ns) + (eval '(require 'm) ns) + (test 5 eval '(lambda (x) x) ns) + (let ([m-ns (eval '(module->namespace ''m) ns)]) + (test 5 eval '(lambda (x) x) m-ns)) + (eval n-code ns) + (eval '(require 'n) ns) + (test 5 eval 'five ns) + (eval p-code ns) + (eval '(require 'p) ns) + (test #f eval 'same? ns) + (let ([n-ns (eval '(module->namespace ''n) ns)]) + (test 5 eval '(lambda (x) x) n-ns))) + (let ([ns (make-base-namespace)]) + (eval m-code ns) + (let ([n-zo (let ([s (open-output-bytes)]) + (parameterize ([current-namespace ns]) + (write (compile n-code) s)) + (parameterize ([read-accept-compiled #t]) + (read (open-input-bytes (get-output-bytes s)))))]) + (eval n-zo ns) + (eval '(require 'n) ns) + (test 5 eval 'five ns) + (eval p-code ns) + (eval '(require 'p) ns) + (test #f eval 'same? ns) + (let ([n-ns (eval '(module->namespace ''n) ns)]) + (test 5 eval '(lambda (x) x) n-ns))))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 146b1454bc..217d2aebc7 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -2404,8 +2404,8 @@ void scheme_prep_namespace_rename(Scheme_Env *menv) } if (l) { - /* Shouldn't we do initial import first, to get shadowing - right? Somehow, it seems to work this way. */ + /* Do initial import first to get shadowing right: */ + l = scheme_reverse(l); for (; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { idx = SCHEME_CAR(l); name = scheme_module_resolve(idx, 0);