~ chicken-core (chicken-5) 2029fcae882dbbf2552b3ae21a606ad0873da398


commit 2029fcae882dbbf2552b3ae21a606ad0873da398
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat Aug 4 11:29:52 2018 +0200
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sun Aug 5 11:21:22 2018 +1200

    Ignore macros when looking up symbol aliases
    
    This makes it so that we don't unintentionally end up using macro
    definitions as identifiers.
    
    Fixes #1493, found by Megane.
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/core.scm b/core.scm
index 2bbed0b2..3ecdd817 100644
--- a/core.scm
+++ b/core.scm
@@ -517,7 +517,7 @@
 
   (define (lookup id)
     (cond ((find-id id (##sys#current-environment)))
-	  ((##sys#get id '##core#macro-alias))
+	  ((##sys#get id '##core#macro-alias) symbol? => values)
 	  (else id)))
 
   (define (macro-alias var)
diff --git a/eval.scm b/eval.scm
index e31fbfce..c34622f7 100644
--- a/eval.scm
+++ b/eval.scm
@@ -92,7 +92,7 @@
 
       (define (rename var)
 	(cond ((find-id var (##sys#current-environment)))
-	      ((##sys#get var '##core#macro-alias))
+	      ((##sys#get var '##core#macro-alias) symbol? => values)
 	      (else var)))
 
       (define (lookup var0 e)
diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm
index 38ae5978..663aa40e 100644
--- a/tests/syntax-tests.scm
+++ b/tests/syntax-tests.scm
@@ -1285,3 +1285,30 @@ other-eval
 (t 1 (letrec* ((foo 1)
 	       (bar foo))
        bar))
+
+
+;; This would crash in nasty ways (see #1493, reported by megane)
+(module self-redefinition (foo)
+  (import scheme (chicken base))
+
+  (define-syntax foo
+    (ir-macro-transformer
+     (lambda (e i c)
+       (apply
+	(lambda (name)
+	  `(begin
+	     (define-syntax ,(strip-syntax name)
+	       (syntax-rules () ((_ . _) 'new)))
+	     'old))
+	(cdr e))))))
+
+(import (rename self-redefinition (foo imported-foo)))
+(import (rename self-redefinition (foo reimported-foo)))
+
+(t 'old (imported-foo imported-foo))
+(t 'new (imported-foo imported-foo))
+
+;; Like any normal redefinition, the underlying exported identifier
+;; changes, and any other imports are simply aliases.
+;;(t 'old (reimported-foo reimported-foo))
+(t 'new (reimported-foo reimported-foo))
Trap