Fix a compilation failure on svref of a symbol macro
authorPaul Khuong <pvk@pvk.ca>
Sat, 30 Mar 2013 18:22:46 +0000 (19:22 +0100)
committerPaul Khuong <pvk@pvk.ca>
Sun, 31 Mar 2013 12:16:03 +0000 (14:16 +0200)
 Introduced in 0892423b (faster SVREF and (SETF SVREF) compilation)

 Thanks to James M. Lawrence for the quick report, with a reduced
 test case.

NEWS
src/compiler/array-tran.lisp
tests/compiler.pure.lisp

diff --git a/NEWS b/NEWS
index 0774be8..0357268 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,8 @@
 ;;;; -*- coding: utf-8; fill-column: 78 -*-
+changes relative to sbcl-1.1.6
+  * bug fix: svref/(setf svref) on symbol macros don't crash the compiler
+    anymore. (Minimal test case provided by James M. Lawrence on sbcl-devel)
+
 changes in sbcl-1.1.6 relative to sbcl-1.1.5:
   * enhancement: the continuable error when defknown-ing over extant 
     fndb entries can be ignored by passing :overwrite-fndb-silently t
index a595e63..d70cdb5 100644 (file)
 (define-source-transform svref (vector index)
   (let ((elt-type (or (when (symbolp vector)
                         (let ((var (lexenv-find vector vars)))
-                          (when var
+                          (when (lambda-var-p var)
                             (type-specifier
                              (array-type-declared-element-type (lambda-var-type var))))))
                       t)))
 (define-source-transform %svset (vector index value)
   (let ((elt-type (or (when (symbolp vector)
                         (let ((var (lexenv-find vector vars)))
-                          (when var
+                          (when (lambda-var-p var)
                             (type-specifier
                              (array-type-declared-element-type (lambda-var-type var))))))
                       t)))
index 833c5ee..1a4fc7d 100644 (file)
 (with-test (:name :second-open-coded)
   (let ((fun (compile nil `(lambda (x) (second x)))))
     (assert (not (ctu:find-named-callees fun)))))
+
+(with-test (:name :svref-of-symbol-macro)
+  (compile nil `(lambda (x)
+                  (symbol-macrolet ((sv x))
+                    (values (svref sv 0) (setf (svref sv 0) 99))))))