X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=tests%2Feval.impure.lisp;h=c79066a816c02e4e527dae3c64dbc031d84d56ee;hb=c589b9363d23ec9133e5396adaf4240cb0a8bd18;hp=da75fb08ad6a947ceb49ed4ecba15a1d7fce0ed8;hpb=0ca182b2e0fd9a7fc8005bef9d21000b326208fc;p=sbcl.git diff --git a/tests/eval.impure.lisp b/tests/eval.impure.lisp index da75fb0..c79066a 100644 --- a/tests/eval.impure.lisp +++ b/tests/eval.impure.lisp @@ -188,4 +188,65 @@ (with-output-to-string (*standard-output*) (eval '(progn (princ ".") (let ((x 42)) t) (princ ".")))))) +;;; IF +(defun true () t) +(defun false () nil) +(defmacro oops () (throw :oops (list))) +(defun test-eval (ok form) (assert (eq ok (catch :oops (eval form))))) +(test-eval t '(if (false) (oops) t)) +(test-eval t '(if (true) t (oops))) +(test-eval nil '(if (not (if (false) t)) (oops))) + +;;; TAGBODY + +;;; As of SBCL 1.0.1.8, TAGBODY should not accept duplicate go tags, +;;; yet choked on two duplicate tags. Note that this test asserts a +;;; failure. +(with-test (:name :tagbody-dual-go-tags) + (progn + (defun tagbody-dual-go-tags () + (restart-case + (handler-bind ((error (lambda (c) + (declare (ignore c)) + (invoke-restart 'NOT-AN-ERROR)))) + (tagbody :A :A) nil) + (NOT-AN-ERROR () t))) + (assert (tagbody-dual-go-tags)))) + +;;; Ensure that NIL is a valid go tag. +(with-test (:name :tagbody-nil-is-valid-tag) + (progn + (defun tagbody-nil-is-valid-tag () + (tagbody (go NIL) NIL) t) + (assert (tagbody-nil-is-valid-tag)))) + +;;; top-level DECLARE is formally undefined, but we want it to raise +;;; an error rather than silently return NIL. +(defvar *scratch*) +(with-test (:name :toplevel-declare) + (assert (raises-error? (eval '(declare (type pathname *scratch*)))))) + +(with-test (:name (eval no-compiler-notes)) + (handler-bind ((sb-ext:compiler-note #'error)) + (let ((sb-ext:*evaluator-mode* :compile)) + (eval '(let ((x 42)) + (if nil x))) + (eval '(let ((* 13)) + (let ((x 42) + (y *)) + (declare (optimize speed)) + (+ x y))))))) + +(with-test (:name :bug-238) + (let ((sb-ext:*evaluator-mode* :compile)) + (handler-bind ((sb-ext:compiler-note #'error)) + (eval '(defclass bug-238 () ())) + (eval '(defmethod bug-238 ((x bug-238) (bug-238 bug-238)) + (call-next-method))) + (eval '(handler-case + (with-input-from-string (*query-io* " no") + (yes-or-no-p)) + (simple-type-error () 'error))) + t))) + ;;; success