diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index 7b13c4b7e7..7216e663ab 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -1795,6 +1795,27 @@ case of module-leve bindings; it doesn't cover local bindings. (test 333 dynamic-require ''module-that-uses-eval-to-define-a-macro-in-its-own-namespace 'result) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check that multiple imports of a name are disallowed +;; when they're from the from the same module but different +;; phases of that module + +(module defines-a-at-two-phase-levels racket/base + (require (for-syntax racket/base)) + + (provide a (for-syntax a)) + + (define a 0) + (begin-for-syntax + (define a 1))) + +(err/rt-test (eval #'(module b racket/base + (require 'defines-a-at-two-phase-levels + (for-syntax racket/base + 'defines-a-at-two-phase-levels)))) + (lambda (exn) + (regexp-match? #rx" already" (exn-message exn)))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 2b5118dbc3..ab43cef9b3 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -7954,9 +7954,10 @@ static void check_require_name(Scheme_Object *id, Scheme_Object *self_modidx, Scheme_Object *srcs; char *fromsrc = NULL, *fromsrc_colon = "", *phase_expl; intptr_t fromsrclen = 0; - + if (same_resolved_modidx(SCHEME_VEC_ELS(vec)[1], modidx) - && SAME_OBJ(SCHEME_VEC_ELS(vec)[2], exname)) { + && SAME_OBJ(SCHEME_VEC_ELS(vec)[2], exname) + && SAME_OBJ(SCHEME_VEC_ELS(vec)[8], scheme_make_integer(exet))) { /* already required, same source; add redundant nominal (for re-provides), and also add source phase for re-provides. */ nml = scheme_make_pair(nominal_modidx, SCHEME_VEC_ELS(vec)[0]);