;;;; While most of SBCL is derived from the CMU CL system, the test
;;;; files (like this one) were written from scratch after the fork
;;;; from CMU CL.
-;;;;
+;;;;
;;;; This software is in the public domain and is provided with
;;;; absolutely no warranty. See the COPYING and CREDITS files for
;;;; more information.
;;; e.g. someone inadvertently ports the bad code.
(defun point39 (x y)
(make-array 2
- :element-type 'double-float
+ :element-type 'double-float
:initial-contents (list x y)))
(declaim (inline point39-x point39-y))
(aref p 1))
(defun order39 (points)
(sort points (lambda (p1 p2)
- (let* ((y1 (point39-y p1))
- (y2 (point39-y p2)))
- (if (= y1 y2)
- (< (point39-x p1)
- (point39-x p2))
- (< y1 y2))))))
+ (let* ((y1 (point39-y p1))
+ (y2 (point39-y p2)))
+ (if (= y1 y2)
+ (< (point39-x p1)
+ (point39-x p2))
+ (< y1 y2))))))
(defun test39 ()
(order39 (make-array 4
- :initial-contents (list (point39 0.0d0 0.0d0)
- (point39 1.0d0 1.0d0)
- (point39 2.0d0 2.0d0)
- (point39 3.0d0 3.0d0)))))
+ :initial-contents (list (point39 0.0d0 0.0d0)
+ (point39 1.0d0 1.0d0)
+ (point39 2.0d0 2.0d0)
+ (point39 3.0d0 3.0d0)))))
(assert (equalp (test39)
- #(#(0.0d0 0.0d0)
- #(1.0d0 1.0d0)
- #(2.0d0 2.0d0)
- #(3.0d0 3.0d0))))
+ #(#(0.0d0 0.0d0)
+ #(1.0d0 1.0d0)
+ #(2.0d0 2.0d0)
+ #(3.0d0 3.0d0))))
(defun complex-double-float-ppc (x y)
(declare (type (complex double-float) x y))
(compile 'single-float-ppc)
(assert (= (single-float-ppc -30) -30f0))
-;;; success
-(quit :unix-status 104)
+;;; constant-folding irrational functions
+(declaim (inline df))
+(defun df (x)
+ ;; do not remove the ECASE here: the bug this checks for indeed
+ ;; depended on this configuration
+ (ecase x (1 least-positive-double-float)))
+(macrolet ((test (fun)
+ (let ((name (intern (format nil "TEST-CONSTANT-~A" fun))))
+ `(progn
+ (defun ,name () (,fun (df 1)))
+ (,name)))))
+ (test sqrt)
+ (test log)
+ (test sin)
+ (test cos)
+ (test tan)
+ (test asin)
+ (test acos)
+ (test atan)
+ (test sinh)
+ (test cosh)
+ (test tanh)
+ (test asinh)
+ (test acosh)
+ (test atanh)
+ (test exp))
+
+;;; Broken move-arg-double-float for non-rsp frame pointers on x86-64
+(defun test (y)
+ (declare (optimize speed))
+ (multiple-value-bind (x)
+ (labels ((aux (x)
+ (declare (double-float x))
+ (etypecase y
+ (double-float
+ nil)
+ (fixnum
+ (aux x))
+ (complex
+ (format t "y=~s~%" y)))
+ (values x)))
+ (aux 2.0d0))
+ x))
+
+(assert (= (test 1.0d0) 2.0d0))
+
+(deftype myarraytype (&optional (length '*))
+ `(simple-array double-float (,length)))
+(defun new-pu-label-from-pu-labels (array)
+ (setf (aref (the myarraytype array) 0)
+ sb-ext:double-float-positive-infinity))
+
+;;; bug 407
+;;;
+;;; FIXME: it may be that TYPE-ERROR is wrong, and we should
+;;; instead signal an overflow or coerce into an infinity.
+(defun bug-407a ()
+ (loop for n from (expt 2 1024) upto (+ 10 (expt 2 1024))
+ do (handler-case
+ (coerce n 'single-float)
+ (simple-type-error ()
+ (return-from bug-407a :type-error)))))
+(assert (eq :type-error (bug-407a)))
+(defun bug-407b ()
+ (loop for n from (expt 2 1024) upto (+ 10 (expt 2 1024))
+ do (handler-case
+ (format t "~E~%" (coerce n 'single-float))
+ (simple-type-error ()
+ (return-from bug-407b :type-error)))))
+(assert (eq :type-error (bug-407b)))