(test-comparison > double-float (/ 0d0 0d0) 0d0)
(test-comparison > double-float 0d0 (/ 0d0 0d0)))))
+(with-test (:name :car-and-cdr-type-derivation-conservative)
+ (let ((f1 (compile nil
+ `(lambda (y)
+ (declare (optimize speed))
+ (let ((x (the (cons fixnum fixnum) (cons 1 2))))
+ (declare (type (cons t fixnum) x))
+ (rplaca x y)
+ (+ (car x) (cdr x))))))
+ (f2 (compile nil
+ `(lambda (y)
+ (declare (optimize speed))
+ (let ((x (the (cons fixnum fixnum) (cons 1 2))))
+ (setf (cdr x) y)
+ (+ (car x) (cdr x)))))))
+ (flet ((test-error (e value)
+ (assert (typep e 'type-error))
+ (assert (eq 'number (type-error-expected-type e)))
+ (assert (eq value (type-error-datum e)))))
+ (let ((v1 "foo")
+ (v2 "bar"))
+ (multiple-value-bind (res err) (ignore-errors (funcall f1 v1))
+ (assert (not res))
+ (test-error err v1))
+ (multiple-value-bind (res err) (ignore-errors (funcall f2 v2))
+ (assert (not res))
+ (test-error err v2))))))
+
+(with-test (:name :array-dimension-derivation-conservative)
+ (let ((f (compile nil
+ `(lambda (x)
+ (declare (optimize speed))
+ (declare (type (array * (4 4)) x))
+ (let ((y x))
+ (setq x (make-array '(4 4)))
+ (adjust-array y '(3 5))
+ (array-dimension y 0))))))
+ (assert (= 3 (funcall f (make-array '(4 4) :adjustable t))))))