1.0.18.27: fix DEFSTRUCT compilation when init-form type is vague
authorNikodemus Siivola <nikodemus@random-state.net>
Tue, 22 Jul 2008 17:17:15 +0000 (17:17 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Tue, 22 Jul 2008 17:17:15 +0000 (17:17 +0000)
 * Reported by Josh Morrison. Regression from the recent DEFSTRUCT
   constructor hacking.

   Slots initialized by constructor lambda-list arguments have their
   types checked, but those slots always initialized directly by the
   initform values did not -- wrap the DSD-DEFAULT in a THE.

NEWS
src/code/defstruct.lisp
tests/defstruct.impure.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index f2a3ae6..96e4136 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@
 changes in sbcl-1.0.19 relative to 1.0.18:
   * optimization: stack allocation is slightly more efficient on x86
     and x86-64.
+  * bug fix: DEFSTRUCT forms with user-specified :CONSTRUCTOR options,
+    where a raw slot always is initialized using the initform whose
+    type is not know sufficiently well a compile-time are now compiled
+    correctly. (reported by John Morrison)
   * bug fix: compiler no longer makes erronous assumptions in the
     presense of non-foldable SATISFIES types.
   * bug fix: stack analysis missed cleanups of dynamic-extent
index c757550..07dd5b4 100644 (file)
                (loop for slot in (dd-slots defstruct)
                      for name = (dsd-name slot)
                      collect (cond ((find name (skipped-vars) :test #'string=)
+                                    ;; CLHS 3.4.6 Boa Lambda Lists
                                     (setf (dsd-safe-p slot) nil)
                                     '.do-not-initialize-slot.)
                                    ((or (find (dsd-name slot) (vars) :test #'string=)
-                                        (dsd-default slot)))))))))
+                                        (let ((type (dsd-type slot)))
+                                          (if (eq t type)
+                                              (dsd-default slot)
+                                              `(the ,type ,(dsd-default slot))))))))))))
 
 ;;; Grovel the constructor options, and decide what constructors (if
 ;;; any) to create.
index 3549268..be0c7e8 100644 (file)
     (assert (eql #c(5.0 5.0) (constant-arg-inits-f foo)))
     (assert (eql #c(6.0d0 6.0d0) (constant-arg-inits-g foo)))))
 (make-constant-arg-inits)
+
+;;; bug reported by John Morrison, 2008-07-22 on sbcl-devel
+(defstruct (raw-slot-struct-with-unknown-init (:constructor make-raw-slot-struct-with-unknown-init ()))
+ (x (#:unknown-function) :type double-float))
+
index 5debd19..33ffdb7 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.18.26"
+"1.0.18.27"