expander: fix problem with define shadowing require

When a `define` that shadows a `require` appears before the `require`,
then the `require` may fail to other, non-shadowed bindings from the
same `require` spec.

Thanks to Matthias for reporting the problem.
This commit is contained in:
Matthew Flatt 2018-08-05 13:44:25 -06:00
parent 33b94e6558
commit df67d4e9d1
3 changed files with 62 additions and 34 deletions

View File

@ -2762,6 +2762,35 @@ case of module-leve bindings; it doesn't cover local bindings.
(expand `(lambda (x) x)))))))) (expand `(lambda (x) x))))))))
ok?))) ok?)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Make sure that an import that is already shadowed by a definition
;; does not prevent importing other things
;; We want enough bindings here to trigger bulk mode
(module provides-a-through-m racket/base
(define a 1)
(define b 2)
(define c 3)
(define d 4)
(define e 5)
(define f 6)
(define g 7)
(define h 8)
(define i 9)
(define j 10)
(define k 11)
(define l 12)
(define m 13)
(provide a b c d e f g h i j k l m))
(module shaodws-c-and-imports-the-rest racket/base
(define c -3)
(require (except-in 'provides-a-through-m a b d e))
(define result f)
(provide result))
(test 6 dynamic-require ''shaodws-c-and-imports-the-rest 'result)
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs) (report-errs)

View File

@ -174,8 +174,8 @@
(define sym-to-reqds (hash-ref! at-mod phase-shift make-hasheq)) (define sym-to-reqds (hash-ref! at-mod phase-shift make-hasheq))
(define prefix-len (if bulk-prefix (string-length (symbol->string bulk-prefix)) 0)) (define prefix-len (if bulk-prefix (string-length (symbol->string bulk-prefix)) 0))
(define br (bulk-required provides prefix-len s provide-phase-level can-be-shadowed?)) (define br (bulk-required provides prefix-len s provide-phase-level can-be-shadowed?))
(for/or ([(out-sym binding/p) (in-hash provides)] (for/fold ([any-already-defined? #f]) ([(out-sym binding/p) (in-hash provides)]
#:unless (not (symbol-interned? out-sym))) #:unless (not (symbol-interned? out-sym)))
(when symbols-accum (hash-set! symbols-accum out-sym #t)) (when symbols-accum (hash-set! symbols-accum out-sym #t))
(cond (cond
[(hash-ref bulk-excepts out-sym #f) [(hash-ref bulk-excepts out-sym #f)
@ -206,7 +206,7 @@
[else #f])) [else #f]))
(unless already-defined? (unless already-defined?
(hash-set! sym-to-reqds sym (cons-ish br (hash-ref sym-to-reqds sym null)))) (hash-set! sym-to-reqds sym (cons-ish br (hash-ref sym-to-reqds sym null))))
already-defined?]))) (or any-already-defined? already-defined?)])))
;; Convert a combination of a symbol and `bulk-required` to a ;; Convert a combination of a symbol and `bulk-required` to a
;; `required` on demand ;; `required` on demand

View File

@ -1882,7 +1882,7 @@ static const char *startup_source =
" prop:stream" " prop:stream"
"(vector" "(vector"
"(lambda(v_0)" "(lambda(v_0)"
"(let-values(((cont?_2946)(range-ref v_0 2)))(if cont?_2946(not(cont?_2946(range-ref v_0 0))) #f)))" "(let-values(((cont?_3268)(range-ref v_0 2)))(if cont?_3268(not(cont?_3268(range-ref v_0 0))) #f)))"
"(lambda(v_0)(range-ref v_0 0))" "(lambda(v_0)(range-ref v_0 0))"
"(lambda(v_0)(make-range((range-ref v_0 1)(range-ref v_0 0))(range-ref v_0 1)(range-ref v_0 2)))))" "(lambda(v_0)(make-range((range-ref v_0 1)(range-ref v_0 0))(range-ref v_0 1)(range-ref v_0 2)))))"
"(cons" "(cons"
@ -1961,7 +1961,7 @@ static const char *startup_source =
"(begin" "(begin"
"(begin" "(begin"
"(if(if(exact-nonnegative-integer? start_0)" "(if(if(exact-nonnegative-integer? start_0)"
"(let-values(((or-part_3061)(< start_0 len_0)))(if or-part_3061 or-part_3061(= len_0 start_0 stop_0)))" "(let-values(((or-part_3439)(< start_0 len_0)))(if or-part_3439 or-part_3439(= len_0 start_0 stop_0)))"
" #f)" " #f)"
"(void)" "(void)"
" (let-values () (raise-range-error who_0 \"vector\" \"starting \" start_0 vec_0 0 (sub1 len_0))))" " (let-values () (raise-range-error who_0 \"vector\" \"starting \" start_0 vec_0 0 (sub1 len_0))))"
@ -2001,11 +2001,11 @@ static const char *startup_source =
"(begin" "(begin"
"(begin" "(begin"
"(if(vector?_0 vec_0)(void)(let-values()(raise-argument-error who_0 type-name_0 vec_0)))" "(if(vector?_0 vec_0)(void)(let-values()(raise-argument-error who_0 type-name_0 vec_0)))"
"(let-values(((len_3070)(unsafe-vector-length_0 vec_0)))" "(let-values(((len_3448)(unsafe-vector-length_0 vec_0)))"
"(let-values(((stop*_3071)(if stop_0 stop_0 len_3070)))" "(let-values(((stop*_3449)(if stop_0 stop_0 len_3448)))"
"(begin" "(begin"
"(check-ranges who_0 vec_0 start_0 stop*_3071 step_0 len_3070)" "(check-ranges who_0 vec_0 start_0 stop*_3449 step_0 len_3448)"
"(values vec_0 start_0 stop*_3071 step_0))))))))" "(values vec_0 start_0 stop*_3449 step_0))))))))"
"(define-values" "(define-values"
"(check-vector)" "(check-vector)"
" (lambda (v_0) (begin (if (vector? v_0) (void) (let-values () (raise-argument-error 'in-vector \"vector\" v_0))))))" " (lambda (v_0) (begin (if (vector? v_0) (void) (let-values () (raise-argument-error 'in-vector \"vector\" v_0))))))"
@ -2035,15 +2035,15 @@ static const char *startup_source =
"(grow-vector)" "(grow-vector)"
"(lambda(vec_0)" "(lambda(vec_0)"
"(begin" "(begin"
"(let-values(((n_3387)(vector-length vec_0)))" "(let-values(((n_3765)(vector-length vec_0)))"
"(let-values(((new-vec_3388)(make-vector(* 2 n_3387))))" "(let-values(((new-vec_3766)(make-vector(* 2 n_3765))))"
"(begin(vector-copy! new-vec_3388 0 vec_0 0 n_3387) new-vec_3388))))))" "(begin(vector-copy! new-vec_3766 0 vec_0 0 n_3765) new-vec_3766))))))"
"(define-values" "(define-values"
"(shrink-vector)" "(shrink-vector)"
"(lambda(vec_0 i_0)" "(lambda(vec_0 i_0)"
"(begin" "(begin"
"(let-values(((new-vec_3391)(make-vector i_0)))" "(let-values(((new-vec_3769)(make-vector i_0)))"
"(begin(vector-copy! new-vec_3391 0 vec_0 0 i_0) new-vec_3391)))))" "(begin(vector-copy! new-vec_3769 0 vec_0 0 i_0) new-vec_3769)))))"
"(define-values" "(define-values"
"(map2)" "(map2)"
"(let-values(((map_4)" "(let-values(((map_4)"
@ -21957,7 +21957,7 @@ static const char *startup_source =
"(void)" "(void)"
"(let-values()(check-in-hash ht_386)))" "(let-values()(check-in-hash ht_386)))"
"((letrec-values(((for-loop_387)" "((letrec-values(((for-loop_387)"
"(lambda(result_0 i_0)" "(lambda(any-already-defined?_0 i_0)"
"(begin" "(begin"
" 'for-loop" " 'for-loop"
"(if i_0" "(if i_0"
@ -21966,16 +21966,16 @@ static const char *startup_source =
"(hash-iterate-key+value" "(hash-iterate-key+value"
" ht_386" " ht_386"
" i_0)))" " i_0)))"
"(let-values(((result_392)" "(let-values(((any-already-defined?_392)"
"(let-values(((result_393)" "(let-values(((any-already-defined?_393)"
" result_0))" " any-already-defined?_0))"
"(if(not" "(if(not"
"(symbol-interned?" "(symbol-interned?"
" out-sym_390))" " out-sym_390))"
" result_393" " any-already-defined?_393"
"(let-values()" "(let-values(((any-already-defined?_394)"
"(let-values(((result_395)" " any-already-defined?_393))"
"(let-values()" "(let-values(((any-already-defined?_395)"
"(let-values()" "(let-values()"
"(begin" "(begin"
"(if symbols-accum_373" "(if symbols-accum_373"
@ -22000,7 +22000,7 @@ static const char *startup_source =
"(let-values()" "(let-values()"
"(string->symbol" "(string->symbol"
"(format" "(format"
" \"~a~a\"" " \"~a~a\""
" bulk-prefix_371" " bulk-prefix_371"
" out-sym_390))))))" " out-sym_390))))))"
"(let-values(((already-defined?_397)" "(let-values(((already-defined?_397)"
@ -22084,20 +22084,19 @@ static const char *startup_source =
" sym-to-reqds_383" " sym-to-reqds_383"
" sym_396" " sym_396"
" null)))))" " null)))))"
" already-defined?_397))))))))))" "(let-values(((or-part_417)"
" any-already-defined?_394))"
"(if or-part_417"
" or-part_417"
" already-defined?_397)))))))))))"
"(values" "(values"
" result_395)))))))" " any-already-defined?_395)))))))"
"(if(if(not" "(if(not #f)"
"((lambda x_0 result_392)"
" out-sym_390"
" binding/p_391))"
"(not #f)"
" #f)"
"(for-loop_387" "(for-loop_387"
" result_392" " any-already-defined?_392"
"(hash-iterate-next ht_386 i_0))" "(hash-iterate-next ht_386 i_0))"
" result_392)))" " any-already-defined?_392)))"
" result_0)))))" " any-already-defined?_0)))))"
" for-loop_387)" " for-loop_387)"
" #f" " #f"
"(hash-iterate-first ht_386))))))))))))))))))))))))))))))" "(hash-iterate-first ht_386))))))))))))))))))))))))))))))"