diff --git a/pkgs/racket-test-core/tests/racket/module.rktl b/pkgs/racket-test-core/tests/racket/module.rktl index 8e12b38ce7..de42f5aa1f 100644 --- a/pkgs/racket-test-core/tests/racket/module.rktl +++ b/pkgs/racket-test-core/tests/racket/module.rktl @@ -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) diff --git a/racket/src/expander/expand/require+provide.rkt b/racket/src/expander/expand/require+provide.rkt index 1338589546..841767d466 100644 --- a/racket/src/expander/expand/require+provide.rkt +++ b/racket/src/expander/expand/require+provide.rkt @@ -174,8 +174,8 @@ (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)] - #:unless (not (symbol-interned? out-sym))) + (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 [(hash-ref bulk-excepts out-sym #f) @@ -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 diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index b47a8e5ec7..4f7f439765 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -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" @@ -22000,7 +22000,7 @@ static const char *startup_source = "(let-values()" "(string->symbol" "(format" -" \"~a~a\"" +" \"~a~a\"" " bulk-prefix_371" " out-sym_390))))))" "(let-values(((already-defined?_397)" @@ -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))))))))))))))))))))))))))))))"