From becf34a79b466f9f7be0a98e1b68c1bb753e1e69 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 28 Dec 2020 14:03:25 -0700 Subject: [PATCH] expander: fix check on `syntax-local-lift-provide` Closes #3589 --- pkgs/racket-test-core/tests/racket/macro.rktl | 16 ++++++++++++++++ racket/src/bc/src/startup.inc | 2 +- racket/src/cs/schemified/expander.scm | 2 +- racket/src/expander/expand/provide.rkt | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/macro.rktl b/pkgs/racket-test-core/tests/racket/macro.rktl index 05ee73b57b..8b3cdc8357 100644 --- a/pkgs/racket-test-core/tests/racket/macro.rktl +++ b/pkgs/racket-test-core/tests/racket/macro.rktl @@ -1276,6 +1276,22 @@ (void)))) (test 10 eval `(dynamic-require '(submod 'm m) 'x))) +;; ---------------------------------------- +;; Check bad lift provide + +(err/rt-test + (eval '(module a '#%kernel + (#%require (for-syntax '#%kernel)) + (define-syntaxes (m) + (lambda (stx) + (let-values ([(ctx) (syntax-local-make-definition-context)]) + (syntax-local-bind-syntaxes (list (quote-syntax x)) (quote-syntax 5) ctx) + (syntax-local-lift-provide (internal-definition-context-introduce ctx (quote-syntax x) 'add)) + (quote-syntax (void))))) + (m))) + exn:fail:syntax? + #rx"provided identifier is not defined or required") + ;; ---------------------------------------- ;; Check module lifting in a top-level context diff --git a/racket/src/bc/src/startup.inc b/racket/src/bc/src/startup.inc index f8e9eeb1a2..33a4e3e89c 100644 --- a/racket/src/bc/src/startup.inc +++ b/racket/src/bc/src/startup.inc @@ -76908,7 +76908,7 @@ static const char *startup_source = "(let-values(((b_0)(resolve+shift/extra-inspector spec_0 at-phase_0 ns_0)))" "(let-values((()" "(begin" -"(if b_0" +"(if(module-binding? b_0)" "(void)" "(let-values()" "(raise-syntax-error$1" diff --git a/racket/src/cs/schemified/expander.scm b/racket/src/cs/schemified/expander.scm index 6e7ef3d74d..e643560c94 100644 --- a/racket/src/cs/schemified/expander.scm +++ b/racket/src/cs/schemified/expander.scm @@ -86603,7 +86603,7 @@ (lambda (spec_0 orig-s_0 sym_0 at-phase_0 ns_0 rp_0 protected?_0) (let ((b_0 (resolve+shift/extra-inspector spec_0 at-phase_0 ns_0))) (begin - (if b_0 + (if (module-binding? b_0) (void) (raise-syntax-error$1 'provide diff --git a/racket/src/expander/expand/provide.rkt b/racket/src/expander/expand/provide.rkt index c7f5b4e66a..788b54bbe2 100644 --- a/racket/src/expander/expand/provide.rkt +++ b/racket/src/expander/expand/provide.rkt @@ -183,7 +183,7 @@ (define (parse-identifier! spec orig-s sym at-phase ns rp protected?) (define b (resolve+shift/extra-inspector spec at-phase ns)) - (unless b + (unless (module-binding? b) (raise-syntax-error provide-form-name "provided identifier is not defined or required" orig-s spec)) (define as-transformer? (binding-for-transformer? b spec at-phase ns)) (define immed-b (resolve+shift spec at-phase #:immediate? #t))