~ chicken-core (chicken-5) 41cff6fc00bc40ce3485ab99725b6073b31a425c


commit 41cff6fc00bc40ce3485ab99725b6073b31a425c
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Thu Jun 23 20:49:27 2011 +0200
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Thu Jun 23 20:49:27 2011 +0200

    Fix strip-syntax for nested renames by storing the realname of the aliased symbol instead of storing the alias as realname (alternatively we could've recursively walked the alias chain, but that's more expensive)

diff --git a/expand.scm b/expand.scm
index 95568dd9..ef6c10ae 100644
--- a/expand.scm
+++ b/expand.scm
@@ -121,8 +121,10 @@
 (define strip-syntax ##sys#strip-syntax)
 
 (define (##sys#extend-se se vars #!optional (aliases (map gensym vars)))
-  (for-each 
-   (cut ##sys#put! <> '##core#real-name <>) 
+  (for-each
+   (lambda (alias sym)
+     (let ((original-real-name (getp sym '##core#real-name)))
+       (putp alias '##core#real-name (or original-real-name sym))))
    aliases vars)
   (append (map (lambda (x y) (cons x y)) vars aliases) se)) ; inline cons
 
diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm
index b573b27b..b01de67f 100644
--- a/tests/syntax-tests.scm
+++ b/tests/syntax-tests.scm
@@ -196,6 +196,18 @@
       (bar foo))))
 )
 
+;;; strip-syntax cuts across multiple levels of syntax
+;;; reported by Matthew Flatt
+(define-syntax c 
+  (syntax-rules () 
+    [(_) 
+     (let ([x 10]) 
+       (let-syntax ([z (syntax-rules ()
+                         [(_) (quote x)])])
+         (z)))]))
+
+(t "x" (symbol->string (c)))
+
 ;;; strip-syntax on renamed module identifiers, as well as core identifiers
 (module foo (bar)
   (import chicken scheme)
Trap