X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompiler.impure.lisp;h=b72c7cc538bf328e8db3543c32a53896954f0316;hb=c831b2828176641e93a45d3fd643e9f58cd44a3f;hp=e8572ce6d6aa5668f65f82c94e84aa2703726a57;hpb=581e3d62de8cb37e13ad9db63e5537c0f962be28;p=sbcl.git diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index e8572ce..b72c7cc 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -348,6 +348,157 @@ BUG 48c, not yet fixed: (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))) + +;;; bug 202: the compiler failed to compile a function, which derived +;;; type contradicted declared. +(declaim (ftype (function () null) bug202)) +(defun bug202 () + t) + +;;; bugs 178, 199: compiler failed to compile a call of a function +;;; with a hairy type +(defun bug178 (x) + (funcall (the function (the standard-object x)))) + +(defun bug199-aux (f) + (eq nil (funcall f))) + +(defun bug199 (f x) + (declare (type (and function (satisfies bug199-aux)) f)) + (funcall f x)) + +;;; check non-toplevel DEFMACRO +(defvar *defmacro-test-status* nil) + +(defun defmacro-test () + (fmakunbound 'defmacro-test-aux) + (let* ((src "defmacro-test.lisp") + (obj (compile-file-pathname src))) + (unwind-protect + (progn + (compile-file src) + (assert (equal *defmacro-test-status* '(function a))) + (setq *defmacro-test-status* nil) + (load obj) + (assert (equal *defmacro-test-status* nil)) + (macroexpand '(defmacro-test-aux 'a)) + (assert (equal *defmacro-test-status* '(macro 'a z-value))) + (eval '(defmacro-test-aux 'a)) + (assert (equal *defmacro-test-status* '(expanded 'a z-value)))) + (ignore-errors (delete-file obj))))) + +(defmacro-test) + +;;; bug 204: EVAL-WHEN inside a local environment +(defvar *bug204-test-status*) + +(defun bug204-test () + (let* ((src "bug204-test.lisp") + (obj (compile-file-pathname src))) + (unwind-protect + (progn + (setq *bug204-test-status* nil) + (compile-file src) + (assert (equal *bug204-test-status* '((:expanded :load-toplevel) + (:called :compile-toplevel) + (:expanded :compile-toplevel)))) + (setq *bug204-test-status* nil) + (load obj) + (assert (equal *bug204-test-status* '((:called :load-toplevel))))) + (ignore-errors (delete-file obj))))) + +(bug204-test) + +;;; toplevel SYMBOL-MACROLET +(defvar *symbol-macrolet-test-status*) + +(defun symbol-macrolet-test () + (let* ((src "symbol-macrolet-test.lisp") + (obj (compile-file-pathname src))) + (unwind-protect + (progn + (setq *symbol-macrolet-test-status* nil) + (compile-file src) + (assert (equal *symbol-macrolet-test-status* + '(2 1))) + (setq *symbol-macrolet-test-status* nil) + (load obj) + (assert (equal *symbol-macrolet-test-status* '(2)))) + (ignore-errors (delete-file obj))))) + +(symbol-macrolet-test) ;;;; tests not in the problem domain, but of the consistency of the ;;;; compiler machinery itself