sbcl-0.8.14.11:
[sbcl.git] / tests / compiler.pure.lisp
index e6d6518..cadd0b0 100644 (file)
   (frob (x y) (position-if x y))
   (frob (x y) (position-if-not x y))
   (frob (x) (aref x 0)))
+
+(macrolet ((frob (style-warn-p form)
+            (if style-warn-p
+                `(catch :got-style-warning
+                  (handler-case
+                      (eval ',form)
+                    (style-warning (e) (throw :got-style-warning nil)))
+                  (error "missing style-warning for ~S" ',form))
+                `(handler-case
+                  (eval ',form)
+                  (style-warning (e)
+                   (error "bad style-warning for ~S: ~A" ',form e))))))
+  (frob t (lambda (x &optional y &key z) (list x y z)))
+  (frob nil (lambda (x &optional y z) (list x y z)))
+  (frob nil (lambda (x &key y z) (list x y z)))
+  (frob t (defgeneric #:foo (x &optional y &key z)))
+  (frob nil (defgeneric #:foo (x &optional y z)))
+  (frob nil (defgeneric #:foo (x &key y z)))
+  (frob t (defun #:foo (x) (flet ((foo (x &optional y &key z) (list x y z))) (foo x x :z x)))))
+
+;;; this was a bug in the LOGXOR type deriver.  The top form gave a
+;;; note, because the system failed to derive the fact that the return
+;;; from LOGXOR was small and negative, though the bottom one worked.
+(handler-bind ((sb-ext:compiler-note #'error))
+  (compile nil '(lambda ()
+                (declare (optimize speed (safety 0)))
+                (lambda (x y)
+                  (declare (type (integer 3 6) x)
+                           (type (integer -6 -3) y))
+                  (+ (logxor x y) most-positive-fixnum)))))
+(handler-bind ((sb-ext:compiler-note #'error))
+  (compile nil '(lambda ()
+                (declare (optimize speed (safety 0)))
+                (lambda (x y)
+                  (declare (type (integer 3 6) y)
+                           (type (integer -6 -3) x))
+                  (+ (logxor x y) most-positive-fixnum)))))
+
+;;; check that modular ash gives the right answer, to protect against
+;;; possible misunderstandings about the hardware shift instruction.
+(assert (zerop (funcall
+               (compile nil '(lambda (x y)
+                              (declare (optimize speed)
+                                       (type (unsigned-byte 32) x y))
+                              (logand #xffffffff (ash x y))))
+               1 257)))