0.8.3.70:
[sbcl.git] / BUGS
diff --git a/BUGS b/BUGS
index 603a51f..cb7b79b 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -1226,3 +1226,66 @@ WORKAROUND:
        strongly suspect that they would.)
     288b2: SINGLE-FLOAT is distinct from DOUBLE-FLOAT. (This is 
        in a sense just one aspect of bug 288a.)
+
+289: "type checking and source-transforms"
+  a.
+    (block nil (let () (funcall #'+ (eval 'nil) (eval '1) (return :good))))
+  signals type error.
+
+  Our policy is to check argument types at the moment of a call. It
+  disagrees with ANSI, which says that type assertions are put
+  immediately onto argument expressions, but is easier to implement in
+  IR1 and is more compatible to type inference, inline expansion,
+  etc. IR1-transforms automatically keep this policy, but source
+  transforms for associative functions (such as +), being applied
+  during IR1-convertion, do not. It may be tolerable for direct calls
+  (+ x y z), but for (FUNCALL #'+ x y z) it is non-conformant.
+
+  b. Another aspect of this problem is efficiency. [x y + z +]
+  requires less registers than [x y z + +]. This transformation is
+  currently performed with source transforms, but it would be good to
+  also perform it in IR1 optimization phase.
+
+290: Alpha floating point and denormalized traps
+  In SBCL 0.8.3.6x on the alpha, we work around what appears to be a
+  hardware or kernel deficiency: the status of the enable/disable
+  denormalized-float traps bit seems to be ambiguous; by the time we
+  get to os_restore_fp_control after a trap, denormalized traps seem
+  to be enabled.  Since we don't want a trap every time someone uses a
+  denormalized float, in general, we mask out that bit when we restore
+  the control word; however, this clobbers any change the user might
+  have made.
+
+291: "bugs in deletion of embedded functions"
+
+  Python fails to compile (simplified version of the problem reported
+  by Nikodemus Siivola)
+
+    (defstruct (line)
+      (%chars ""))
+
+    (defun update-window-imag (line)
+      (tagbody
+       TOP
+         (if (null line)
+             (go DONE)
+             (go TOP))
+       DONE
+         (unless (eq current the-sentinel)
+           (let* ((cc (car current))
+                  (old-line (dis-line-line cc)))
+             (if (eq old-line line)
+                 (do ((chars (line-%chars line) nil)) ; <LET>
+                     (())
+                   (let* ()
+                     (multiple-value-call
+                         #'(lambda (&optional g2740 g2741 &rest g2742)
+                             (declare (ignore g2742))
+                             (catch 'foo ; <CLEANUP>
+                               (values (setq string g2740) (setq underhang g2741))))
+                       (foo)))
+                   (setf (dis-line-old-chars cc) chars)))))))
+
+  Compiler deletes unreachable BIND node of <LET>, but its body,
+  including reference to the variable CHARS, remains reachable through
+  NLX from <CLEANUP>.