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:
parent
33b94e6558
commit
df67d4e9d1
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))))))))))))))))))))))))))))))"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user