;;;; absolutely no warranty. See the COPYING and CREDITS files for
;;;; more information.
+(cl:in-package :sb-c)
+
+(defknown compiler-derived-type (t) (values t t) (movable flushable unsafe))
+
+(deftransform compiler-derived-type ((x))
+ `(values ',(type-specifier (lvar-type x)) t))
+
+(defun compiler-derived-type (x)
+ (values t nil))
+
(cl:in-package :cl-user)
;; The tests in this file assume that EVAL will use the compiler
(the ,type x)))))
(compile nil (make-lambda 'list))
(compile nil (make-lambda 'vector))))))
+
+;;; this caused a momentary regression when an ill-adviced fix to
+;;; bug 427 made ANY-REG suitable for primitive-type T:
+;;;
+;;; no :MOVE-ARG VOP defined to move #<SB-C:TN t1> (SC SB-VM::SINGLE-REG) to #<SB-C:TN t2> (SC SB-VM::ANY-REG)
+;;; [Condition of type SIMPLE-ERROR]
+(compile nil
+ '(lambda (frob)
+ (labels
+ ((%zig (frob)
+ (typecase frob
+ (double-float
+ (setf (sb-alien:deref (sb-alien:cast (sb-alien:sap-alien (unknown1) (* unsigned-char))
+ (* double-float))) frob))
+ (hash-table
+ (%zig (the (values (single-float (0.0) 1.0) &optional) (unknown2)))
+ nil))))
+ (%zig))))
+
+;;; non-required arguments in HANDLER-BIND
+(assert (eq :oops (car (funcall (compile nil
+ '(lambda (x)
+ (block nil
+ (handler-bind ((error (lambda (&rest args) (return (cons :oops args)))))
+ (/ 2 x)))))
+ 0))))
+
+;;; NIL is a legal function name
+(assert (eq 'a (flet ((nil () 'a)) (nil))))
+
+;;; misc.528
+(assert (null (let* ((x 296.3066f0)
+ (y 22717067)
+ (form `(lambda (r p2)
+ (declare (optimize speed (safety 1))
+ (type (simple-array single-float nil) r)
+ (type (integer -9369756340 22717335) p2))
+ (setf (aref r) (* ,x (the (eql 22717067) p2)))
+ (values)))
+ (r (make-array nil :element-type 'single-float))
+ (expected (* x y)))
+ (funcall (compile nil form) r y)
+ (let ((actual (aref r)))
+ (unless (eql expected actual)
+ (list expected actual))))))
+;;; misc.529
+(assert (null (let* ((x -2367.3296f0)
+ (y 46790178)
+ (form `(lambda (r p2)
+ (declare (optimize speed (safety 1))
+ (type (simple-array single-float nil) r)
+ (type (eql 46790178) p2))
+ (setf (aref r) (+ ,x (the (integer 45893897) p2)))
+ (values)))
+ (r (make-array nil :element-type 'single-float))
+ (expected (+ x y)))
+ (funcall (compile nil form) r y)
+ (let ((actual (aref r)))
+ (unless (eql expected actual)
+ (list expected actual))))))
+
+;;; misc.556
+(assert (eql -1
+ (funcall
+ (compile nil '(lambda (p1 p2)
+ (declare
+ (optimize (speed 1) (safety 0)
+ (debug 0) (space 0))
+ (type (member 8174.8604) p1)
+ (type (member -95195347) p2))
+ (floor p1 p2)))
+ 8174.8604 -95195347)))
+
+;;; misc.557
+(assert (eql -1
+ (funcall
+ (compile
+ nil
+ '(lambda (p1)
+ (declare (optimize (speed 3) (safety 0) (debug 3) (space 1))
+ (type (member -94430.086f0) p1))
+ (floor (the single-float p1) 19311235)))
+ -94430.086f0)))
+
+;;; misc.558
+(assert (eql -1.0f0
+ (funcall
+ (compile
+ nil
+ '(lambda (p1)
+ (declare (optimize (speed 1) (safety 2)
+ (debug 2) (space 3))
+ (type (eql -39466.56f0) p1))
+ (ffloor p1 305598613)))
+ -39466.56f0)))
+
+;;; misc.559
+(assert (eql 1
+ (funcall
+ (compile
+ nil
+ '(lambda (p1)
+ (declare (optimize (speed 1) (safety 1) (debug 1) (space 2))
+ (type (eql -83232.09f0) p1))
+ (ceiling p1 -83381228)))
+ -83232.09f0)))
+
+;;; misc.560
+(assert (eql 1
+ (funcall
+ (compile
+ nil
+ '(lambda (p1)
+ (declare (optimize (speed 1) (safety 1)
+ (debug 1) (space 0))
+ (type (member -66414.414f0) p1))
+ (ceiling p1 -63019173f0)))
+ -66414.414f0)))
+
+;;; misc.561
+(assert (eql 1.0f0
+ (funcall
+ (compile
+ nil
+ '(lambda (p1)
+ (declare (optimize (speed 0) (safety 1)
+ (debug 0) (space 1))
+ (type (eql 20851.398f0) p1))
+ (fceiling p1 80839863)))
+ 20851.398f0)))
+
+;;; misc.581
+(assert (floatp
+ (funcall
+ (compile nil '(lambda (x)
+ (declare (type (eql -5067.2056) x))
+ (+ 213734822 x)))
+ -5067.2056)))
+
+;;; misc.581a
+(assert (typep
+ (funcall
+ (compile nil '(lambda (x) (declare (type (eql -1.0) x))
+ (+ #x1000001 x)))
+ -1.0f0)
+ 'single-float))
+
+;;; misc.582
+(assert (plusp (funcall
+ (compile
+ nil
+ ' (lambda (p1)
+ (declare (optimize (speed 0) (safety 1) (debug 1) (space 1))
+ (type (eql -39887.645) p1))
+ (mod p1 382352925)))
+ -39887.645)))
+
+;;; misc.587
+(assert (let ((result (funcall
+ (compile
+ nil
+ '(lambda (p2)
+ (declare (optimize (speed 0) (safety 3) (debug 1) (space 0))
+ (type (eql 33558541) p2))
+ (- 92215.266 p2)))
+ 33558541)))
+ (typep result 'single-float)))
+
+;;; misc.635
+(assert (eql 1
+ (let* ((form '(lambda (p2)
+ (declare (optimize (speed 0) (safety 1)
+ (debug 2) (space 2))
+ (type (member -19261719) p2))
+ (ceiling -46022.094 p2))))
+ (values (funcall (compile nil form) -19261719)))))
+
+;;; misc.636
+(assert (let* ((x 26899.875)
+ (form `(lambda (p2)
+ (declare (optimize (speed 3) (safety 1) (debug 3) (space 1))
+ (type (member ,x #:g5437 char-code #:g5438) p2))
+ (* 104102267 p2))))
+ (floatp (funcall (compile nil form) x))))
+
+;;; misc.622
+(assert (eql
+ (funcall
+ (compile
+ nil
+ '(lambda (p2)
+ (declare (optimize (speed 3) (safety 2) (debug 3) (space 0))
+ (type real p2))
+ (+ 81535869 (the (member 17549.955 #:g35917) p2))))
+ 17549.955)
+ (+ 81535869 17549.955)))
+
+;;; misc.654
+(assert (eql 2
+ (let ((form '(lambda (p2)
+ (declare (optimize (speed 0) (safety 2) (debug 0) (space 2))
+ (type (member integer eql) p2))
+ (coerce 2 p2))))
+ (funcall (compile nil form) 'integer))))
+
+;;; misc.656
+(assert (eql 2
+ (let ((form '(lambda (p2)
+ (declare (optimize (speed 0) (safety 2) (debug 0) (space 2))
+ (type (member integer mod) p2))
+ (coerce 2 p2))))
+ (funcall (compile nil form) 'integer))))
+
+;;; misc.657
+(assert (eql 2
+ (let ((form '(lambda (p2)
+ (declare (optimize (speed 0) (safety 2) (debug 0) (space 2))
+ (type (member integer values) p2))
+ (coerce 2 p2))))
+ (funcall (compile nil form) 'integer))))
+
+(with-test (:name :string-aref-type)
+ (assert (eq 'character
+ (funcall (compile nil
+ '(lambda (s)
+ (sb-c::compiler-derived-type (aref (the string s) 0))))
+ "foo"))))
+
+(with-test (:name :base-string-aref-type)
+ (assert (eq 'base-char
+ (funcall (compile nil
+ '(lambda (s)
+ (sb-c::compiler-derived-type (aref (the base-string s) 0))))
+ (coerce "foo" 'base-string)))))
+
+(with-test (:name :dolist-constant-type-derivation)
+ (assert (equal '(integer 1 3)
+ (funcall (compile nil
+ '(lambda (x)
+ (dolist (y '(1 2 3))
+ (when x
+ (return (sb-c::compiler-derived-type y))))))
+ t))))
+
+(with-test (:name :dolist-simple-list-type-derivation)
+ (assert (equal '(integer 1 3)
+ (funcall (compile nil
+ '(lambda (x)
+ (dolist (y (list 1 2 3))
+ (when x
+ (return (sb-c::compiler-derived-type y))))))
+ t))))
+
+(with-test (:name :dolist-dotted-constant-list-type-derivation)
+ (let* ((warned nil)
+ (fun (handler-bind ((style-warning (lambda (c) (push c warned))))
+ (compile nil
+ '(lambda (x)
+ (dolist (y '(1 2 3 . 4) :foo)
+ (when x
+ (return (sb-c::compiler-derived-type y)))))))))
+ (assert (equal '(integer 1 3) (funcall fun t)))
+ (assert (= 1 (length warned)))
+ (multiple-value-bind (res err) (ignore-errors (funcall fun nil))
+ (assert (not res))
+ (assert (typep err 'type-error)))))