;;;; While most of SBCL is derived from the CMU CL system, the test
;;;; files (like this one) were written from scratch after the fork
;;;; from CMU CL.
-;;;;
+;;;;
;;;; This software is in the public domain and is provided with
;;;; absolutely no warranty. See the COPYING and CREDITS files for
;;;; more information.
;;; referred to unbound slots. This was reported and fixed by Antonio
;;; Martinez (sbcl-devel 2002-09-10).
(format t
- "~&printable now: ~A~%"
- (make-condition 'file-error :pathname "foo"))
+ "~&printable now: ~A~%"
+ (make-condition 'file-error :pathname "foo"))
(assert (eq
(block nil
;;; clauses in HANDLER-CASE are allowed to have declarations (and
;;; indeed, only declarations)
-(assert
+(assert
(null (handler-case (error "foo") (error () (declare (optimize speed))))))
(handler-case
(control-error (c) (format nil "~A" c))
;; there had better be an error
(:no-error (&rest args) (error "No error: ~S" args)))
+
+(handler-case
+ (funcall (lambda (x) (check-type x fixnum) x) t)
+ (type-error (c)
+ (assert (and (subtypep (type-error-expected-type c) 'fixnum)
+ (subtypep 'fixnum (type-error-expected-type c))))
+ (assert (eq (type-error-datum c) t)))
+ (:no-error (&rest rest) (error "no error: ~S" rest)))
+
+;;; ANSI specifies TYPE-ERROR if datum and arguments of ERROR are not
+;;; designators for a condition. Reported by Bruno Haible on cmucl-imp
+;;; 2004-10-12.
+(flet ((test (&rest args)
+ (multiple-value-bind (res err)
+ (ignore-errors (apply #'error args))
+ (assert (not res))
+ (assert (typep err 'type-error))
+ (assert (not (nth-value 1 (ignore-errors
+ (type-error-datum err)))))
+ (assert (not (nth-value 1 (ignore-errors
+ (type-error-expected-type err))))))))
+ (test '#:no-such-condition)
+ (test nil)
+ (test t)
+ (test 42)
+ (test (make-instance 'standard-object)))
+
+;;; If CERROR is given a condition, any remaining arguments are only
+;;; used for the continue format control.
+(let ((x 0))
+ (handler-bind
+ ((simple-error (lambda (c) (incf x) (continue c))))
+ (cerror "Continue from ~A at ~A"
+ (make-condition 'simple-error :format-control "foo"
+ :format-arguments nil)
+ 'cerror (get-universal-time))
+ (assert (= x 1))))