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.
This commit is contained in:
Matthew Flatt 2016-07-30 08:18:04 -06:00
parent 96d212d376
commit b1e406b5a7
2 changed files with 24 additions and 2 deletions

View File

@ -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)

View File

@ -7956,7 +7956,8 @@ static void check_require_name(Scheme_Object *id, Scheme_Object *self_modidx,
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]);