Fix (compile '(setf function)).
authorStas Boukarev <stassats@gmail.com>
Sun, 13 Oct 2013 17:04:30 +0000 (21:04 +0400)
committerStas Boukarev <stassats@gmail.com>
Sun, 13 Oct 2013 17:04:30 +0000 (21:04 +0400)
COMPILE was defined as
(name &optional (definition (or (macro-function name) (fdefinition name))))

The call to macro-function caused an error when called on '(setf x).
Change it to
(or (and (symbolp name) (macro-function name))
    (fdefinition name))

Reported by Douglas Katzman.

NEWS
src/compiler/target-main.lisp
tests/compiler.impure.lisp

diff --git a/NEWS b/NEWS
index 34cb3f8..714bf18 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ changes relative to sbcl-1.1.12:
     from the same location.  (patch by Douglas Katzman, lp#1042405)
   * bug fix: Create vectors of proper internal length when reading literal
     vectors from FASLs. (Reported by Jan Moringen)
+  * bug fix: COMPILE can now succefully compile setf functions.
+    (Reported by Douglas Katzman)
 
 changes in sbcl-1.1.12 relative to sbcl-1.1.11:
   * enhancement: Add sb-bsd-sockets:socket-shutdown, for calling
index 791c2d4..0b11bda 100644 (file)
           (t
            (values compiled-definition warnings-p failure-p)))))
 
-(defun compile (name &optional (definition (or (macro-function name)
+(defun compile (name &optional (definition (or (and (symbolp name)
+                                                    (macro-function name))
                                                (fdefinition name))))
   #!+sb-doc
   "Produce a compiled function from DEFINITION. If DEFINITION is a
index 7ab3ee5..c0f5b0a 100644 (file)
         (defun (setf test-984) ())
         nil)
      (style-warning () t))))
+
+(with-test (:name :compile-setf-function)
+  (defun (setf compile-setf) ())
+  (assert (equal (compile '(setf compile-setf))
+                 '(setf compile-setf))))
+
 \f
 ;;;; tests not in the problem domain, but of the consistency of the
 ;;;; compiler machinery itself