:external-format '#:nonsense)))
(assert (= (the (values integer symbol) (values 1 'foo 13)) 1))
+
+(let ((f (compile nil
+ '(lambda (v)
+ (declare (optimize (safety 3)))
+ (list (the fixnum (the (real 0) (eval v))))))))
+ (assert (raises-error? (funcall f 0.1) type-error))
+ (assert (raises-error? (funcall f -1) type-error)))
+
+;;; the implicit block does not enclose lambda list
+(let ((forms '((defmacro #1=#:foo (&optional (x (return-from #1#))))
+ #+nil(macrolet ((#2=#:foo (&optional (x (return-from #2#))))))
+ (define-compiler-macro #3=#:foo (&optional (x (return-from #3#))))
+ (deftype #4=#:foo (&optional (x (return-from #4#))))
+ (define-setf-expander #5=#:foo (&optional (x (return-from #5#))))
+ (defsetf #6=#:foo (&optional (x (return-from #6#))) ()))))
+ (dolist (form forms)
+ (assert (nth-value 2 (compile nil `(lambda () ,form))))))
+
+(assert (nth-value 2 (compile nil
+ '(lambda ()
+ (svref (make-array '(8 9) :adjustable t) 1)))))
+
+;;; CHAR= did not check types of its arguments (reported by Adam Warner)
+(raises-error? (funcall (compile nil '(lambda (x y z) (char= x y z)))
+ #\a #\b nil)
+ type-error)
+(raises-error? (funcall (compile nil
+ '(lambda (x y z)
+ (declare (optimize (speed 3) (safety 3)))
+ (char/= x y z)))
+ nil #\a #\a)
+ type-error)
+
+;;; Compiler lost return type of MAPCAR and friends
+(dolist (fun '(mapcar mapc maplist mapl))
+ (assert (nth-value 2 (compile nil
+ `(lambda (x)
+ (1+ (,fun #'print x)))))))
+
+(assert (nth-value 2 (compile nil
+ '(lambda ()
+ (declare (notinline mapcar))
+ (1+ (mapcar #'print '(1 2 3)))))))
+
+;; bug found by Paul Dietz: (SETF AREF) for bit vectors with constant
+;; index was effectless
+(let ((f (compile nil '(lambda (a v)
+ (declare (type simple-bit-vector a) (type bit v))
+ (declare (optimize (speed 3) (safety 0)))
+ (setf (aref a 0) v)
+ a))))
+ (let ((y (make-array 2 :element-type 'bit :initial-element 0)))
+ (assert (equal y #*00))
+ (funcall f y 1)
+ (assert (equal y #*10))))
+
+(handler-bind ((sb-ext:compiler-note #'error))
+ (compile nil '(lambda (x)
+ (declare (type (simple-array (simple-string 3) (5)) x))
+ (aref (aref x 0) 0))))