0.8.18.14:
[sbcl.git] / tests / arith.pure.lisp
index 8c47082..2b1266d 100644 (file)
 (assert (= (coerce 1/2 '(complex float)) #c(0.5 0.0)))
 (assert (= (coerce 1.0d0 '(complex float)) #c(1.0d0 0.0d0)))
 
+;;; (COERCE #c(<RATIONAL> <RATIONAL>) '(complex float)) resulted in
+;;; an error up to 0.8.17.31
+(assert (= (coerce #c(1 2) '(complex float)) #c(1.0 2.0)))
+
 ;;; COERCE also sometimes failed to verify that a particular coercion
 ;;; was possible (in particular coercing rationals to bounded float
 ;;; types.
             ((1+ most-positive-fixnum) (1+ most-positive-fixnum) nil)
             ((1+ most-positive-fixnum) (1- most-negative-fixnum) t)
             (1 (ash most-negative-fixnum 1) nil)
-            (29 most-negative-fixnum t)
-            (30 (ash most-negative-fixnum 1) t)
-            (31 (ash most-negative-fixnum 1) t)
-            (64 (ash most-negative-fixnum 36) nil)
-            (65 (ash most-negative-fixnum 36) t)))
+            (#.(- sb-vm:n-word-bits sb-vm:n-lowtag-bits) most-negative-fixnum t)
+            (#.(1+ (- sb-vm:n-word-bits sb-vm:n-lowtag-bits)) (ash most-negative-fixnum 1) t)
+            (#.(+ 2 (- sb-vm:n-word-bits sb-vm:n-lowtag-bits)) (ash most-negative-fixnum 1) t)
+            (#.(+ sb-vm:n-word-bits 32) (ash most-negative-fixnum #.(+ 32 sb-vm:n-lowtag-bits 1)) nil)
+            (#.(+ sb-vm:n-word-bits 33) (ash most-negative-fixnum #.(+ 32 sb-vm:n-lowtag-bits 1)) t)))
   (destructuring-bind (index int result) x
     (assert (eq (eval `(logbitp ,index ,int)) result))))
 
 ;;; ASH of a negative bignum by a bignum count would erroneously
 ;;; return 0 prior to sbcl-0.8.4.4
 (assert (= (ash (1- most-negative-fixnum) (1- most-negative-fixnum)) -1))
+
+;;; Whoops.  Too much optimization in division operators for 0
+;;; divisor.
+(macrolet ((frob (name)
+            `(let ((fn (compile nil '(lambda (x)
+                                      (declare (optimize speed) (fixnum x))
+                                      (,name x 0)))))
+              (assert (raises-error? (funcall fn 1) division-by-zero)))))
+  (frob mod)
+  (frob truncate)
+  (frob rem)
+  (frob /)
+  (frob floor)
+  (frob ceiling))