0.6.8.15:
[sbcl.git] / BUGS
diff --git a/BUGS b/BUGS
index 158cbde..395fbab 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -22,45 +22,24 @@ but instead
      the program loops endlessly instead of printing the object.
 
 
-KNOWN BUGS RELATED TO THE IR1 INTERPRETER
+NOTES:
 
-(Note: At some point, the pure interpreter (aka the "IR1 interpreter")
-will probably go away (replaced by constructs like
-  (DEFUN EVAL (X) (FUNCALL (COMPILE NIL (LAMBDA ..)))))
-and at that time these bugs should go away automatically. Until then,
-they'll probably remain, since they're not considered urgent.
-After the IR1 interpreter goes away is also the preferred time
-to start systematically exterminating cases where debugging
-functionality (backtrace, breakpoint, etc.) breaks down, since
-getting rid of the IR1 interpreter will reduce the number of
-special cases we need to support.)
+There is also some information on bugs in the manual page and
+in the TODO file. Eventually more such information may move here.
 
-IR1-1:
-  The FUNCTION special operator doesn't check properly whether its
-  argument is a function name. E.g. (FUNCTION (X Y)) returns a value
-  instead of failing with an error. (Later attempting to funcall the
-  value does cause an error.) 
-
-IR1-2:
-  COMPILED-FUNCTION-P bogusly reports T for interpreted functions:
-       * (DEFUN FOO (X) (- 12 X))
-       FOO
-       * (COMPILED-FUNCTION-P #'FOO)
-       T
+The gaps in the number sequence belong to old bugs which have been
+fixed.
 
 
 KNOWN BUGS OF NO SPECIAL CLASS:
 
-(Note:
-  * There is also some information on bugs in the manual page and
-    in the TODO file. Eventually more such information may move here.
-  * The gaps in the number sequence belong to old bugs which were
-    eliminated.)
-
 2:
   DEFSTRUCT should almost certainly overwrite the old LAYOUT information
   instead of just punting when a contradictory structure definition
-  is loaded.
+  is loaded. As it is, if you redefine DEFSTRUCTs in a way which 
+  changes their layout, you probably have to rebuild your entire
+  program, even if you know or guess enough about the internals of
+  SBCL to wager that this (undefined in ANSI) operation would be safe.
 
 3:
   It should cause a STYLE-WARNING, not a full WARNING, when a structure
@@ -78,7 +57,7 @@ KNOWN BUGS OF NO SPECIAL CLASS:
   very good when the stream argument has the wrong type, because
   the operation tries to fall through to Gray stream code, and then
   dies because it's undefined. E.g. 
-    (PRINT-UNREADABLE-OBJECT (*STANDARD-OUTPUT* 1))
+    (PRINT-UNREADABLE-OBJECT (*STANDARD-OUTPUT* 1)) ..)
   gives the error message
     error in SB-KERNEL::UNDEFINED-SYMBOL-ERROR-HANDLER:
       The function SB-IMPL::STREAM-WRITE-STRING is undefined.
@@ -277,15 +256,6 @@ becomes FASL:
   DTC's recommended workaround from the mailing list 3 Mar 2000:
        (setf (pcl::find-class 'ccc1) (pcl::find-class 'ccc))
 
-21:
-  There's probably a bug in the compiler handling of special variables
-  in closures, inherited from the CMU CL code, as reported on the
-  CMU CL mailing list. There's a patch for this on the CMU CL
-  mailing list too:
-    Message-ID: <38C8E188.A1E38B5E@jeack.com.au>
-    Date: Fri, 10 Mar 2000 22:50:32 +1100
-    From: "Douglas T. Crosher" <dtc@jeack.com.au>
-
 22:
   The ANSI spec, in section "22.3.5.2 Tilde Less-Than-Sign: Logical Block",
   says that an error is signalled if ~W, ~_, ~<...~:>, ~I, or ~:T is used
@@ -776,3 +746,97 @@ Error in function C::GET-LAMBDA-TO-COMPILE:
     (FAIL 12)
   then requesting a BACKTRACE at the debugger prompt gives no information
   about where in the user program the problem occurred.
+
+62:
+  The compiler is supposed to do type inference well enough that 
+  the declaration in
+    (TYPECASE X
+      ((SIMPLE-ARRAY SINGLE-FLOAT)
+       (LOCALLY
+         (DECLARE (TYPE (SIMPLE-ARRAY SINGLE-FLOAT) X))
+         ..))
+      ..)
+  is redundant. However, as reported by Juan Jose Garcia Ripoll for
+  CMU CL, it sometimes doesn't. Adding declarations is a pretty good
+  workaround for the problem for now, but can't be done by the TYPECASE
+  macros themselves, since it's too hard for the macro to detect
+  assignments to the variable within the clause. 
+    Note: The compiler *is* smart enough to do the type inference in
+  many cases. This case, derived from a couple of MACROEXPAND-1
+  calls on Ripoll's original test case,
+    (DEFUN NEGMAT (A)
+      (DECLARE (OPTIMIZE SPEED (SAFETY 0)))
+      (COND ((TYPEP A '(SIMPLE-ARRAY SINGLE-FLOAT)) NIL
+             (LET ((LENGTH (ARRAY-TOTAL-SIZE A)))
+               (LET ((I 0) (G2554 LENGTH))
+                 (DECLARE (TYPE REAL G2554) (TYPE REAL I))
+                 (TAGBODY
+                  SB-LOOP::NEXT-LOOP
+                  (WHEN (>= I G2554) (GO SB-LOOP::END-LOOP))
+                  (SETF (ROW-MAJOR-AREF A I) (- (ROW-MAJOR-AREF A I)))
+                  (GO SB-LOOP::NEXT-LOOP)
+                  SB-LOOP::END-LOOP))))))
+  demonstrates the problem; but the problem goes away if the TAGBODY
+  and GO forms are removed (leaving the SETF in ordinary, non-looping
+  code), or if the TAGBODY and GO forms are retained, but the 
+  assigned value becomes 0.0 instead of (- (ROW-MAJOR-AREF A I)).
+  
+
+KNOWN BUGS RELATED TO THE IR1 INTERPRETER
+
+(Note: At some point, the pure interpreter (actually a semi-pure
+interpreter aka "the IR1 interpreter") will probably go away, replaced
+by constructs like
+  (DEFUN EVAL (X) (FUNCALL (COMPILE NIL (LAMBDA ..)))))
+and at that time these bugs should either go away automatically or
+become more tractable to fix. Until then, they'll probably remain,
+since some of them aren't considered urgent, and the rest are too hard
+to fix as long as so many special cases remain. After the IR1
+interpreter goes away is also the preferred time to start
+systematically exterminating cases where debugging functionality
+(backtrace, breakpoint, etc.) breaks down, since getting rid of the
+IR1 interpreter will reduce the number of special cases we need to
+support.)
+
+IR1-1:
+  The FUNCTION special operator doesn't check properly whether its
+  argument is a function name. E.g. (FUNCTION (X Y)) returns a value
+  instead of failing with an error. (Later attempting to funcall the
+  value does cause an error.) 
+
+IR1-2:
+  COMPILED-FUNCTION-P bogusly reports T for interpreted functions:
+       * (DEFUN FOO (X) (- 12 X))
+       FOO
+       * (COMPILED-FUNCTION-P #'FOO)
+       T
+
+IR1-3:
+  Executing 
+    (DEFVAR *SUPPRESS-P* T)
+    (EVAL '(UNLESS *SUPPRESS-P*
+             (EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)
+               (FORMAT T "surprise!"))))
+  prints "surprise!". Probably the entire EVAL-WHEN mechanism ought to be
+  rewritten from scratch to conform to the ANSI definition, abandoning
+  the *ALREADY-EVALED-THIS* hack which is used in sbcl-0.6.8.9 (and
+  in the original CMU CL source, too). This should be easier to do --
+  though still nontrivial -- once the various IR1 interpreter special
+  cases are gone.
+
+IR1-3a:
+  EVAL-WHEN's idea of what's a toplevel form is even more screwed up 
+  than the example in IR1-3 would suggest, since COMPILE-FILE and
+  COMPILE both print both "right now!" messages when compiling the
+  following code,
+    (LAMBDA (X)
+      (COND (X
+             (EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)
+              (PRINT "yes! right now!"))
+             "yes!")
+            (T
+             (EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)
+               (PRINT "no! right now!"))
+             "no!")))
+  and while EVAL doesn't print the "right now!" messages, the first
+  FUNCALL on the value returned by EVAL causes both of them to be printed.