0.9.18.12: valid/already-dumped confusion in the file compiler/
[sbcl.git] / BUGS
diff --git a/BUGS b/BUGS
index 6e719bc..963ff68 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -635,31 +635,6 @@ WORKAROUND:
 
   This is probably the same bug as 162
 
-217: "Bad type operations with FUNCTION types"
-  In sbcl.0.7.7:
-
-    * (values-type-union (specifier-type '(function (base-char)))
-                         (specifier-type '(function (integer))))
-
-    #<FUN-TYPE (FUNCTION (BASE-CHAR) *)>
-
-  It causes insertion of wrong type assertions into generated
-  code. E.g.
-
-    (defun foo (x s)
-      (let ((f (etypecase x
-                 (character #'write-char)
-                 (integer #'write-byte))))
-        (funcall f x s)
-        (etypecase x
-          (character (write-char x s))
-          (integer (write-byte x s)))))
-
-   Then (FOO #\1 *STANDARD-OUTPUT*) signals type error.
-
-  (In 0.7.9.1 the result type is (FUNCTION * *), so Python does not
-  produce invalid code, but type checking is not accurate.)
-
 235: "type system and inline expansion"
   a.
   (declaim (ftype (function (cons) number) acc))
@@ -675,6 +650,10 @@ WORKAROUND:
 
   (foo '(nil) '(t)) => NIL, T.
 
+  As of 0.9.15.41 this seems to be due to ACC being inlined only once
+  inside FOO, which results in the second call reusing the FUNCTIONAL
+  resulting from the first -- which doesn't check the type.
+
 237: "Environment arguments to type functions"
   a. Functions SUBTYPEP, TYPEP, UPGRADED-ARRAY-ELEMENT-TYPE, and 
      UPGRADED-COMPLEX-PART-TYPE now have an optional environment
@@ -1009,13 +988,8 @@ WORKAROUND:
   The problem is that both EVALs sequentially write to the same LVAR.
 
 306: "Imprecise unions of array types"
-  a.(defun foo (x)
-      (declare (optimize speed)
-               (type (or (array cons) (array vector)) x))
-      (elt (aref x 0) 0))
-    (foo #((0))) => TYPE-ERROR
 
-  relatedly,
+  a. fixed in SBCL 0.9.15.48
 
   b.(subtypep 
      'array
@@ -1228,21 +1202,7 @@ WORKAROUND:
    iii. supplied-p variables for &optional and &key arguments are not
         bound.
 
-  c. qualifier matching incorrect
-  (progn
-    (define-method-combination mc27 () 
-        ((normal ()) 
-         (ignored (:ignore :unused)))
-      `(list 'result 
-             ,@(mapcar #'(lambda (method) `(call-method ,method)) normal)))
-    (defgeneric test-mc27 (x)
-      (:method-combination mc27)
-      (:method :ignore ((x number)) (/ 0)))
-    (test-mc27 7))
-
-  should signal an invalid-method-error, as the :IGNORE (NUMBER)
-  method is applicable, and yet matches neither of the method group
-  qualifier patterns.
+  c. (fixed in sbcl-0.9.15.15)
 
 344: more (?) ROOM T problems (possibly part of bug 108)
   In sbcl-0.8.12.51, and off and on leading up to it, the
@@ -1421,54 +1381,6 @@ WORKAROUND:
   Expected: #<SB-MOP:FUNCALLABLE-STANDARD-CLASS STANDARD-GENERIC-FUNCTION>
   Got:      #<SB-MOP:FUNCALLABLE-STANDARD-CLASS MY-GENERIC-FUNCTION>
 
-361: initialize-instance of standard-reader-method ignores :function argument
-    (reported by Bruno Haible)
-  Pass a custom :function argument to initialize-instance of a
-  standard-reader-method instance, but it has no effect.
-  ;; Check that it's possible to define reader methods that do typechecking.
-  (progn
-    (defclass typechecking-reader-method (sb-pcl:standard-reader-method)
-      ())
-    (defmethod initialize-instance ((method typechecking-reader-method) &rest initargs
-                                    &key slot-definition)
-      (let ((name (sb-pcl:slot-definition-name slot-definition))
-            (type (sb-pcl:slot-definition-type slot-definition)))
-        (apply #'call-next-method method
-               :function #'(lambda (args next-methods)
-                             (declare (ignore next-methods))
-                             (apply #'(lambda (instance)
-                                        (let ((value (slot-value instance name)))
-                                          (unless (typep value type)
-                                            (error "Slot ~S of ~S is not of type ~S: ~S"
-                                                   name instance type value))
-                                          value))
-                                    args))
-               initargs)))
-    (defclass typechecking-reader-class (standard-class)
-      ())
-    (defmethod sb-pcl:validate-superclass ((c1 typechecking-reader-class) (c2 standard-class))
-      t)
-    (defmethod reader-method-class ((class typechecking-reader-class) direct-slot &rest args)
-      (find-class 'typechecking-reader-method))
-    (defclass testclass25 ()
-      ((pair :type (cons symbol (cons symbol null)) :initarg :pair :accessor testclass25-pair))
-      (:metaclass typechecking-reader-class))
-   (macrolet ((succeeds (form)
-                 `(not (nth-value 1 (ignore-errors ,form)))))
-      (let ((p (list 'abc 'def))
-            (x (make-instance 'testclass25)))
-        (list (succeeds (make-instance 'testclass25 :pair '(seventeen 17)))
-              (succeeds (setf (testclass25-pair x) p))
-              (succeeds (setf (second p) 456))
-              (succeeds (testclass25-pair x))
-              (succeeds (slot-value x 'pair))))))
-  Expected: (t t t nil t)
-  Got:      (t t t t t)
-
-  (inspect (first (sb-pcl:generic-function-methods #'testclass25-pair)))
-  shows that the method was created with a FAST-FUNCTION slot but with a
-  FUNCTION slot of NIL.
-
 362: missing error when a slot-definition is created without a name
     (reported by Bruno Haible)
   The MOP says about slot-definition initialization:
@@ -1492,80 +1404,6 @@ WORKAROUND:
   Expected: ERROR
   Got: #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION FOO>
 
-367: TYPE-ERROR at compile time, undetected TYPE-ERROR at runtime
-  This test program
-    (declaim (optimize (safety 3) (debug 2) (speed 2) (space 1)))
-    (defstruct e367)
-    (defstruct i367)
-    (defstruct g367
-      (i367s (make-array 0 :fill-pointer t) :type (or (vector i367) null)))
-    (defstruct s367
-      (g367 (error "missing :G367") :type g367 :read-only t))
-    ;;; In sbcl-0.8.18, commenting out this (DECLAIM (FTYPE ... R367))
-    ;;; gives an internal error at compile time:
-    ;;;    The value #<SB-KERNEL:NAMED-TYPE NIL> is not of
-    ;;;    type SB-KERNEL:VALUES-TYPE.
-    (declaim (ftype (function ((vector i367) e367) (or s367 null)) r367))
-    (declaim (ftype (function ((vector e367)) (values)) h367))
-    (defun frob (v w)
-      (let ((x (g367-i367s (make-g367))))
-        (let* ((y (or (r367 x w)
-                      (h367 x)))
-               (z (s367-g367 y)))
-          (format t "~&Y=~S Z=~S~%" y z)
-          (g367-i367s z))))
-    (defun r367 (x y) (declare (ignore x y)) nil)
-    (defun h367 (x) (declare (ignore x)) (values))
-    ;;; In sbcl-0.8.18, executing this form causes an low-level error
-    ;;;   segmentation violation at #X9B0E1F4
-    ;;; (instead of the TYPE-ERROR that one might like).
-    (frob 0 (make-e367))
-  can be made to cause two different problems, as noted in the comments:
-    bug 367a: Compile and load the file. No TYPE-ERROR is signalled at 
-      run time (in the (S367-G367 Y) form of FROB, when Y is NIL 
-      instead of an instance of S367). Instead (on x86/Linux at least)
-      we end up with a segfault.
-    bug 367b: Comment out the (DECLAIM (FTYPE ... R367)), and compile 
-      the file. The compiler fails with TYPE-ERROR at compile time.
-
-368: miscompiled OR (perhaps related to bug 367)
-  Trying to relax type declarations to find a workaround for bug 367,
-  it turns out that even when the return type isn't declared (or 
-  declared to be T, anyway) the system remains confused about type 
-  inference in code similar to that for bug 367:
-    (in-package :cl-user)
-    (declaim (optimize (safety 3) (debug 2) (speed 2) (space 1)))
-    (defstruct e368)
-    (defstruct i368)
-    (defstruct g368
-      (i368s (make-array 0 :fill-pointer t) :type (or (vector i368) null)))
-    (defstruct s368
-      (g368 (error "missing :G368") :type g368 :read-only t))
-    (declaim (ftype (function (fixnum (vector i368) e368) t) r368))
-    (declaim (ftype (function (fixnum (vector e368)) t) h368))
-    (defparameter *h368-was-called-p* nil)
-    (defun nsu (vertices e368)
-      (let ((i368s (g368-i368s (make-g368))))
-        (let ((fuis (r368 0 i368s e368)))
-          (format t "~&FUIS=~S~%" fuis)
-          (or fuis (h368 0 i368s)))))
-    (defun r368 (w x y)
-      (declare (ignore w x y))
-      nil)
-    (defun h368 (w x)
-      (declare (ignore w x))
-      (setf *h368-was-called-p* t)
-      (make-s368 :g368 (make-g368)))
-    (trace r368 h368)
-    (format t "~&calling NSU~%")
-    (let ((nsu (nsu #() (make-e368))))
-      (format t "~&NSU returned ~S~%" nsu)
-      (format t "~&*H368-WAS-CALLED-P*=~S~%" *h368-was-called-p*)
-      (assert (s368-p nsu))
-      (assert *h368-was-called-p*))
-  In sbcl-0.8.18, both ASSERTs fail, and (DISASSEMBLE 'NSU) shows
-  that no call to H368 is compiled.
-
 369: unlike-an-intersection behavior of VALUES-TYPE-INTERSECTION
   In sbcl-0.8.18.2, the identity $(x \cap y \cap y)=(x \cap y)$ 
   does not hold for VALUES-TYPE-INTERSECTION, even for types which
@@ -1703,16 +1541,6 @@ WORKAROUND:
   stack exhaustion checking (implemented with a write-protected guard
   page) does not work on SunOS/x86.
 
-387:
-  12:10 < jsnell> the package-lock test is basically due to a change in the test 
-                  behaviour when you install a handler for error around it. I 
-                  thought I'd disabled the test for now, but apparently that was 
-                  my imagination
-  12:19 < Xophe> jsnell: ah, I see the problem in the package-locks stuff
-  12:19 < Xophe> it's the same problem as we had with compiler-error conditions
-  12:19 < Xophe> the thing that's signalled up and down the stack is a subtype of
-                  ERROR, where it probably shouldn't be
-
 388:
   (found by Dmitry Bogomolov)
 
@@ -1874,3 +1702,24 @@ WORKAROUND:
     VECTOR-POP: #() has length zero
   perhaps because CLISP has shuffled the clauses into an 
   ANSI-compliant order before proceeding.
+
+405: a TYPE-ERROR in MERGE-LETS exercised at DEBUG 3
+  In sbcl-0.9.16.21 on linux/86, compiling 
+    (declaim (optimize (debug 3)))
+    (defstruct foo bar)
+    (let ()
+      (flet ((i (x) (frob x (foo-bar foo))))
+        (i :five)))
+  causes a TYPE-ERROR 
+    The value NIL is not of type SB-C::PHYSENV.
+  in MERGE-LETS.
+
+406: functional has external references -- failed aver
+ Given the following food in a single file
+  (eval-when (:compile-toplevel :load-toplevel :execute)
+    (defstruct foo3))
+  (defstruct bar
+    (foo #.(make-foo3)))
+ as of 0.9.18.11 the file compiler breaks on it:
+  failed AVER: "(NOT (FUNCTIONAL-HAS-EXTERNAL-REFERENCES-P CLAMBDA))"
+ Defining the missing MAKE-LOAD-FORM method makes the error go away.