~ chicken-core (chicken-5) d345e514c10956a7e95267dfd027725f89394122


commit d345e514c10956a7e95267dfd027725f89394122
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat Feb 25 17:04:28 2017 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Mar 22 11:15:54 2017 +0100

    Export internal define-like definitions from chicken.syntax
    
    Without this, the compiler would "inline" these aggressively as
    unspecified, because they're not assigned to from within the
    module itself.
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/expand.scm b/expand.scm
index 9e194b96..9ee0140b 100644
--- a/expand.scm
+++ b/expand.scm
@@ -42,7 +42,13 @@
    strip-syntax
    syntax-error
    er-macro-transformer
-   ir-macro-transformer)
+   ir-macro-transformer
+
+   ;; These must be exported or the compiler will assume they're never
+   ;; assigned to.
+   define-definition
+   define-syntax-definition
+   define-values-definition)
 
 (import scheme chicken
 	chicken.keyword)
@@ -471,9 +477,9 @@
 ;
 ; This code is disgustingly complex.
 
-(define chicken.expand#define-definition)
-(define chicken.expand#define-syntax-definition)
-(define chicken.expand#define-values-definition)
+(define define-definition)
+(define define-syntax-definition)
+(define define-values-definition)
 
 (define ##sys#canonicalize-body
   (lambda (body #!optional (se (##sys#current-environment)) cs?)
@@ -481,9 +487,9 @@
       (let ((f (lookup id se)))
 	(or (eq? s f)
 	    (case s
-	      ((define) (if f (eq? f chicken.expand#define-definition) (eq? s id)))
-	      ((define-syntax) (if f (eq? f chicken.expand#define-syntax-definition) (eq? s id)))
-	      ((define-values) (if f (eq? f chicken.expand#define-values-definition) (eq? s id)))
+	      ((define) (if f (eq? f define-definition) (eq? s id)))
+	      ((define-syntax) (if f (eq? f define-syntax-definition) (eq? s id)))
+	      ((define-values) (if f (eq? f define-values-definition) (eq? s id)))
 	      (else (eq? s id))))))
     (define (fini vars vals mvars body)
       (if (and (null? vars) (null? mvars))
diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm
index 4f07a3c6..1da12c34 100644
--- a/tests/syntax-tests.scm
+++ b/tests/syntax-tests.scm
@@ -790,6 +790,9 @@
 ;; Some tests for nested but valid definition expressions:
 (t 2 (eval '(begin (define x 1) 2)))
 (t 2 (eval '(module _ () (import scheme) (define x 1) 2)))
+(t 1 (eval '(let ()
+	      (define-record-type foo (make-foo bar) foo? (bar foo-bar))
+	      (foo-bar (make-foo 1)))))
 
 ;;; renaming of keyword argument (#277)
 
Trap