From 62b8f7aaa3aaff708ee358d0c99defe100e0b3c9 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 7 Aug 2016 12:06:36 -0600 Subject: [PATCH] fix `syntax-local-lift-values-expression` When lifts are captured as `let`, make sure the variable bindings aren't reversed. --- pkgs/racket-test-core/tests/racket/macro.rktl | 23 +++++++++++++++++++ racket/src/racket/src/compenv.c | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-test-core/tests/racket/macro.rktl b/pkgs/racket-test-core/tests/racket/macro.rktl index 4b751819ba..b2a3940acf 100644 --- a/pkgs/racket-test-core/tests/racket/macro.rktl +++ b/pkgs/racket-test-core/tests/racket/macro.rktl @@ -1642,6 +1642,29 @@ (m (check) (check2))) + +;; ---------------------------------------- +;; Check that `syntax-local-lift-values-expression` works rigth when lifts +;; are converted to `let`; in particular, make sure the order is +;; right + +(module uses-local-lift-values-at-expansion-time racket/base + (require (for-syntax racket/base)) + (begin-for-syntax + (require (for-syntax racket/base)) + + (define-syntax (m stx) + #`(values #,@(syntax-local-lift-values-expression 3 #'(values 1 2 3))))) + + (define-syntax (n stx) + (define-values (a b c) (m)) + #`(list #,a #,b #,c)) + + (provide l) + (define l (n))) + +(test '(1 2 3) dynamic-require ''uses-local-lift-values-at-expansion-time 'l) + ;; ---------------------------------------- (report-errs) diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index 4c732e69eb..77f85b7900 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -978,7 +978,7 @@ void scheme_set_compilation_variables(Scheme_Comp_Env *frame, Scheme_IR_Local ** for (i = 0; i < count; i++) { MZ_ASSERT(!frame->vars[i+pos]); - frame->vars[i+pos] = vars[i]; + frame->vars[i+pos] = vars[count - i - 1]; } }