From b1e406b5a71866c90fdc47cd9e1c436f1b1f47fe Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 30 Jul 2016 08:18:04 -0600 Subject: [PATCH] fix redundant-require checking When a module defines and exports an identifier at two phases, and when another module imports both of them at the same phase, an error was not reported as it should have been. --- .../racket-test-core/tests/racket/module.rktl | 21 +++++++++++++++++++ racket/src/racket/src/module.c | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) 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]);