1.0.21.27: no more &OPTIONAL-DISPATCH debug names
[sbcl.git] / tests / compiler.pure.lisp
index a1c0ee8..6f48dad 100644 (file)
 ;;;; 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
                                              (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 #+sb-unicode 'base-char
+             #-sb-unicode 'character
+             (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)))))
+
+(with-test (:name :constant-list-destructuring)
+  (handler-bind ((sb-ext:compiler-note #'error))
+    (progn
+      (assert (= 10
+                 (funcall
+                  (compile nil
+                           '(lambda ()
+                             (destructuring-bind (a (b c) d) '(1 (2 3) 4)
+                               (+ a b c d)))))))
+      (assert (eq :feh
+                  (funcall
+                   (compile nil
+                            '(lambda (x)
+                              (or x
+                               (destructuring-bind (a (b c) d) '(1 "foo" 4)
+                                 (+ a b c d)))))
+                   :feh))))))
+
+;;; Functions with non-required arguments used to end up with
+;;; (&OPTIONAL-DISPATCH ...) as their names.
+(with-test (:name :hairy-function-name)
+  (assert (eq 'read-line (nth-value 2 (function-lambda-expression #'read-line))))
+  (assert (equal "#<FUNCTION READ-LINE>" (princ-to-string #'read-line))))