diff --git a/pkgs/racket-test-core/tests/racket/namespac.rktl b/pkgs/racket-test-core/tests/racket/namespac.rktl index 7852725e31..4b73de4ea1 100644 --- a/pkgs/racket-test-core/tests/racket/namespac.rktl +++ b/pkgs/racket-test-core/tests/racket/namespac.rktl @@ -393,15 +393,30 @@ (eval (eval '(def))) (test 1 eval '(ref))) -#| -(define-syntax-rule (m3 c-id) - (begin - (define-syntax plus #f) - (define (c-id) (compile #'(define plus plus))))) +;; When a binding is present, it takes precedence over +;; a "temporary" binding: +(parameterize ([current-namespace (make-base-namespace)]) + (eval '(require (for-syntax racket/base))) + (eval '(define-syntax-rule (m3 c-id) + (begin + (define-syntax plus #f) + (define (c-id) (compile #'(define plus plus)))))) + (eval '(m3 cdef)) + (err/rt-test (eval '(cdef)) exn:fail:syntax?)) -(m3 cdef) -(cdef) -|# +;; A "temporary" binding should work on an identifier with +;; no `#%top` in its context: +(parameterize ([current-namespace (make-base-namespace)]) + (eval '(require (for-syntax racket/base))) + (eval '(define-syntax (m3 stx) + (with-syntax ([(gen) (generate-temporaries '(gen))]) + (syntax-case stx () + [(_ id) + #'(begin + (define (gen) gen) + (define id gen))])))) + (eval '(m3 self)) + (test #t eval '(eq? self (self)))) ;; ---------------------------------------- diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index e20cfc60f9..b38bd15f7a 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -1443,9 +1443,17 @@ scheme_compile_lookup(Scheme_Object *find_id, Scheme_Comp_Env *env, int flags, *_menv = genv; if (SCHEME_STXP(find_id)) { - if (flags & SCHEME_NULL_FOR_UNBOUND) - return NULL; find_global_id = scheme_future_global_binding(find_id, env->genv); + if (!SAME_OBJ(find_global_id, SCHEME_STX_VAL(find_id)) + && SCHEME_FALSEP(binding)) { + /* Since we got a symbol back, there's at least a "temporary" + top-level binding for the identifier in the current namespace */ + binding = scheme_make_vector(3, NULL); + SCHEME_VEC_ELS(binding)[0] = find_global_id; + SCHEME_VEC_ELS(binding)[1] = (env->genv->module ? env->genv->module->modname : scheme_false); + SCHEME_VEC_ELS(binding)[2] = scheme_env_phase(env->genv); + } else if (flags & SCHEME_NULL_FOR_UNBOUND) + return NULL; } else find_global_id = find_id;