From 6f31650539c9f06252bc1e72f322aa09da73b46d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 30 Apr 2018 21:05:09 -0600 Subject: [PATCH] repair for re-expansion of an implicit-form expansion The repair in 385f9588f86c56f44c26545772db6454995a7908 propagates the must-be-bound callback too far. It shouldn't be propagated anymore after a non-rename transformer is applied. Closes #2048 --- pkgs/racket-test-core/tests/racket/macro.rktl | 10 ++++++++++ racket/src/expander/expand/main.rkt | 6 +++--- racket/src/racket/src/startup.inc | 5 +++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/macro.rktl b/pkgs/racket-test-core/tests/racket/macro.rktl index 8544934312..37200ba25b 100644 --- a/pkgs/racket-test-core/tests/racket/macro.rktl +++ b/pkgs/racket-test-core/tests/racket/macro.rktl @@ -1950,6 +1950,16 @@ (let-syntax ([#%datum (make-rename-transformer #'unbound)]) (+ 1 2)))) +(module make-sure-not-bound-as-syntax-is-not-propagated-to-reexpansion racket/base + (module new-top racket/base + (provide #%top) + (define (helper sym) sym) + (define-syntax-rule (#%top . ID) + (helper 'ID))) + + (local-require (submod 'new-top)) + foobar) + ;; ---------------------------------------- ;; Check that definition context bindings are made available when the context is provided as fourth ;; argument of syntax-local-bind-syntaxes diff --git a/racket/src/expander/expand/main.rkt b/racket/src/expander/expand/main.rkt index ca2f9b03bd..d6c1f61888 100644 --- a/racket/src/expander/expand/main.rkt +++ b/racket/src/expander/expand/main.rkt @@ -128,10 +128,10 @@ (cond [(eq? binding 'ambiguous) (when fail-non-transformer (fail-non-transformer)) - (raise-ambiguous-error id ctx)] + (raise-ambiguous-error id ctx)] [(not binding) (when fail-non-transformer (fail-non-transformer)) - ;; The `#%app` binding might do something with unbound ids + ;; The `#%app` binding might do something with unbound ids (expand-implicit '#%app (substitute-alternate-id s alternate-id) ctx id)] [else ;; Find out whether it's bound as a variable, syntax, or core form @@ -322,7 +322,7 @@ id)) #:skip-log? (or (expand-context-only-immediate? ctx) (rename-transformer? t)) - #:fail-non-transformer fail-non-transformer)])])) + #:fail-non-transformer (and (rename-transformer? t) fail-non-transformer))])])) ;; Handle the expansion of a variable to itself (define (dispatch-variable t s id ctx binding primitive? protected?) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index 49ff052816..f958d84c18 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -39985,11 +39985,12 @@ static const char *startup_source = "(let-values(((or-part_263)" "(expand-context-only-immediate? ctx_23)))" "(if or-part_263 or-part_263(1/rename-transformer? t_53))))" -"((fail-non-transformer199_0) fail-non-transformer_4))" +"((temp199_0)" +"(if(1/rename-transformer? t_53) fail-non-transformer_4 #f)))" "(expand9.1" " temp197_0" " #t" -" fail-non-transformer199_0" +" temp199_0" " #t" " temp198_0" " #t"