;; Uncomment and it works
))
(eff)))
+
+;;; bug 192a, fixed by APD "more strict type checking" patch
+;;; (sbcl-devel 2002-08-07)
+(defun bug192a (x)
+ (declare (optimize (speed 0) (safety 3)))
+ ;; Even with bug 192a, this declaration was checked as an assertion.
+ (declare (real x))
+ (+ x
+ (locally
+ ;; Because of bug 192a, this declaration was trusted without checking.
+ (declare (single-float x))
+ (sin x))))
+(assert (null (ignore-errors (bug192a nil))))
+(multiple-value-bind (result error) (ignore-errors (bug192a 100))
+ (assert (null result))
+ (assert (equal (type-error-expected-type error) 'single-float)))
+
+;;; bug 194, fixed in part by APD "more strict type checking" patch
+;;; (sbcl-devel 2002-08-07)
+(progn
+ #+nil ; FIXME: still broken in 0.7.7.19 (after patch)
+ (multiple-value-bind (result error)
+ (ignore-errors (multiple-value-prog1 (progn (the real '(1 2 3)))))
+ (assert (null result))
+ (assert (typep error 'type-error)))
+ #+nil ; FIXME: still broken in 0.7.7.19 (after patch)
+ (multiple-value-bind (result error)
+ (ignore-errors (the real '(1 2 3)))
+ (assert (null result))
+ (assert (typep error 'type-error))))
\f
;;; BUG 48a. and b. (symbol-macrolet handling), fixed by Eric Marsden
;;; and Raymond Toy for CMUCL, fix ported for sbcl-0.7.6.18.
(compile nil '(lambda () (symbol-macrolet ((t nil)) t)))
(assert failure-p)
(assert (raises-error? (funcall function) program-error)))
-
(multiple-value-bind (function warnings-p failure-p)
- (compile nil '(lambda () (symbol-macrolet ((*standard-input* nil)) *standard-input*)))
+ (compile nil
+ '(lambda ()
+ (symbol-macrolet ((*standard-input* nil))
+ *standard-input*)))
(assert failure-p)
(assert (raises-error? (funcall function) program-error)))
#||
(if x t (if y t (dont-constrain-if-too-much x y))))
(assert (null (dont-constrain-if-too-much-aux nil nil)))
+
+;;; TYPE-ERROR confusion ca. sbcl-0.7.7.24, reported and fixed by
+;;; APD sbcl-devel 2002-09-14
+(defun exercise-0-7-7-24-bug (x)
+ (declare (integer x))
+ (let (y)
+ (setf y (the single-float (if (> x 0) x 3f0)))
+ (list y y)))
+(multiple-value-bind (v e) (ignore-errors (exercise-0-7-7-24-bug 4))
+ (assert (null v))
+ (assert (typep e 'type-error)))
+(assert (equal (exercise-0-7-7-24-bug -4) '(3f0 3f0)))
+
+;;; non-intersecting type declarations were DWIMing in a confusing
+;;; fashion until sbcl-0.7.7.28, when APD reported and fixed the
+;;; problem.
+(defun non-intersecting-the (x)
+ (let (y)
+ (setf y (the single-float (the integer x)))
+ (list y y)))
+
+(raises-error? (foo 3) type-error)
+(raises-error? (foo 3f0) type-error)
+
+;;; until 0.8.2 SBCL did not check THEs in arguments
+(defun the-in-arguments-aux (x)
+ x)
+(defun the-in-arguments-1 (x)
+ (list x (the-in-arguments-aux (the (single-float 0s0) x))))
+(defun the-in-arguments-2 (x)
+ (list x (the-in-arguments-aux (the single-float x))))
+
+(multiple-value-bind (result condition)
+ (ignore-errors (the-in-arguments-1 1))
+ (assert (null result))
+ (assert (typep condition 'type-error)))
+(multiple-value-bind (result condition)
+ (ignore-errors (the-in-arguments-2 1))
+ (assert (null result))
+ (assert (typep condition 'type-error)))
+
+;;; bug 153: a hole in a structure slot type checking
+(declaim (optimize safety))
+(defstruct foo153
+ (bla 0 :type fixnum))
+(defun bug153-1 ()
+ (let ((foo (make-foo153)))
+ (setf (foo153-bla foo) '(1 . 1))
+ (format t "Is ~a of type ~a a cons? => ~a~%"
+ (foo153-bla foo)
+ (type-of (foo153-bla foo))
+ (consp (foo153-bla foo)))))
+(defun bug153-2 (x)
+ (let ((foo (make-foo153)))
+ (setf (foo153-bla foo) x)
+ (format t "Is ~a of type ~a a cons? => ~a~%"
+ (foo153-bla foo)
+ (type-of (foo153-bla foo))
+ (consp (foo153-bla foo)))))
+
+(multiple-value-bind (result condition)
+ (ignore-errors (bug153-1))
+ (declare (ignore result))
+ (assert (typep condition 'type-error)))
+(multiple-value-bind (result condition)
+ (ignore-errors (bug153-2 '(1 . 1)))
+ (declare (ignore result))
+ (assert (typep condition 'type-error)))
+
+;;; bug 110: the compiler flushed the argument type test and the default
+;;; case in the cond.
+
+(defun bug110 (x)
+ (declare (optimize (safety 2) (speed 3)))
+ (declare (type (or string stream) x))
+ (cond ((typep x 'string) 'string)
+ ((typep x 'stream) 'stream)
+ (t
+ 'none)))
+
+(multiple-value-bind (result condition)
+ (ignore-errors (bug110 0))
+ (declare (ignore result))
+ (assert (typep condition 'type-error)))
\f
;;;; tests not in the problem domain, but of the consistency of the
;;;; compiler machinery itself