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))))))))
|
||||
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)
|
||||
|
|
|
@ -174,7 +174,7 @@
|
|||
(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 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)))
|
||||
(when symbols-accum (hash-set! symbols-accum out-sym #t))
|
||||
(cond
|
||||
|
@ -206,7 +206,7 @@
|
|||
[else #f]))
|
||||
(unless already-defined?
|
||||
(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
|
||||
;; `required` on demand
|
||||
|
|
|
@ -1882,7 +1882,7 @@ static const char *startup_source =
|
|||
" prop:stream"
|
||||
"(vector"
|
||||
"(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)(make-range((range-ref v_0 1)(range-ref v_0 0))(range-ref v_0 1)(range-ref v_0 2)))))"
|
||||
"(cons"
|
||||
|
@ -1961,7 +1961,7 @@ static const char *startup_source =
|
|||
"(begin"
|
||||
"(begin"
|
||||
"(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)"
|
||||
"(void)"
|
||||
" (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"
|
||||
"(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(((stop*_3071)(if stop_0 stop_0 len_3070)))"
|
||||
"(let-values(((len_3448)(unsafe-vector-length_0 vec_0)))"
|
||||
"(let-values(((stop*_3449)(if stop_0 stop_0 len_3448)))"
|
||||
"(begin"
|
||||
"(check-ranges who_0 vec_0 start_0 stop*_3071 step_0 len_3070)"
|
||||
"(values vec_0 start_0 stop*_3071 step_0))))))))"
|
||||
"(check-ranges who_0 vec_0 start_0 stop*_3449 step_0 len_3448)"
|
||||
"(values vec_0 start_0 stop*_3449 step_0))))))))"
|
||||
"(define-values"
|
||||
"(check-vector)"
|
||||
" (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)"
|
||||
"(lambda(vec_0)"
|
||||
"(begin"
|
||||
"(let-values(((n_3387)(vector-length vec_0)))"
|
||||
"(let-values(((new-vec_3388)(make-vector(* 2 n_3387))))"
|
||||
"(begin(vector-copy! new-vec_3388 0 vec_0 0 n_3387) new-vec_3388))))))"
|
||||
"(let-values(((n_3765)(vector-length vec_0)))"
|
||||
"(let-values(((new-vec_3766)(make-vector(* 2 n_3765))))"
|
||||
"(begin(vector-copy! new-vec_3766 0 vec_0 0 n_3765) new-vec_3766))))))"
|
||||
"(define-values"
|
||||
"(shrink-vector)"
|
||||
"(lambda(vec_0 i_0)"
|
||||
"(begin"
|
||||
"(let-values(((new-vec_3391)(make-vector i_0)))"
|
||||
"(begin(vector-copy! new-vec_3391 0 vec_0 0 i_0) new-vec_3391)))))"
|
||||
"(let-values(((new-vec_3769)(make-vector i_0)))"
|
||||
"(begin(vector-copy! new-vec_3769 0 vec_0 0 i_0) new-vec_3769)))))"
|
||||
"(define-values"
|
||||
"(map2)"
|
||||
"(let-values(((map_4)"
|
||||
|
@ -21957,7 +21957,7 @@ static const char *startup_source =
|
|||
"(void)"
|
||||
"(let-values()(check-in-hash ht_386)))"
|
||||
"((letrec-values(((for-loop_387)"
|
||||
"(lambda(result_0 i_0)"
|
||||
"(lambda(any-already-defined?_0 i_0)"
|
||||
"(begin"
|
||||
" 'for-loop"
|
||||
"(if i_0"
|
||||
|
@ -21966,16 +21966,16 @@ static const char *startup_source =
|
|||
"(hash-iterate-key+value"
|
||||
" ht_386"
|
||||
" i_0)))"
|
||||
"(let-values(((result_392)"
|
||||
"(let-values(((result_393)"
|
||||
" result_0))"
|
||||
"(let-values(((any-already-defined?_392)"
|
||||
"(let-values(((any-already-defined?_393)"
|
||||
" any-already-defined?_0))"
|
||||
"(if(not"
|
||||
"(symbol-interned?"
|
||||
" out-sym_390))"
|
||||
" result_393"
|
||||
"(let-values()"
|
||||
"(let-values(((result_395)"
|
||||
"(let-values()"
|
||||
" any-already-defined?_393"
|
||||
"(let-values(((any-already-defined?_394)"
|
||||
" any-already-defined?_393))"
|
||||
"(let-values(((any-already-defined?_395)"
|
||||
"(let-values()"
|
||||
"(begin"
|
||||
"(if symbols-accum_373"
|
||||
|
@ -22084,20 +22084,19 @@ static const char *startup_source =
|
|||
" sym-to-reqds_383"
|
||||
" sym_396"
|
||||
" null)))))"
|
||||
" already-defined?_397))))))))))"
|
||||
"(let-values(((or-part_417)"
|
||||
" any-already-defined?_394))"
|
||||
"(if or-part_417"
|
||||
" or-part_417"
|
||||
" already-defined?_397)))))))))))"
|
||||
"(values"
|
||||
" result_395)))))))"
|
||||
"(if(if(not"
|
||||
"((lambda x_0 result_392)"
|
||||
" out-sym_390"
|
||||
" binding/p_391))"
|
||||
"(not #f)"
|
||||
" #f)"
|
||||
" any-already-defined?_395)))))))"
|
||||
"(if(not #f)"
|
||||
"(for-loop_387"
|
||||
" result_392"
|
||||
" any-already-defined?_392"
|
||||
"(hash-iterate-next ht_386 i_0))"
|
||||
" result_392)))"
|
||||
" result_0)))))"
|
||||
" any-already-defined?_392)))"
|
||||
" any-already-defined?_0)))))"
|
||||
" for-loop_387)"
|
||||
" #f"
|
||||
"(hash-iterate-first ht_386))))))))))))))))))))))))))))))"
|
||||
|
|
Loading…
Reference in New Issue
Block a user