X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Floop.pure.lisp;h=5cd85f327654e150eaa14ef2033b3d7c376cb726;hb=1cba0af01f5107ab384d0d8b94b1f6330b3d0ef4;hp=917731a9a7cc11886440b930ea983d22032b6929;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/tests/loop.pure.lisp b/tests/loop.pure.lisp index 917731a..5cd85f3 100644 --- a/tests/loop.pure.lisp +++ b/tests/loop.pure.lisp @@ -13,6 +13,8 @@ (in-package "CL-USER") +(load "compiler-test-util.lisp") + ;;; The bug reported by Alexei Dejneka on sbcl-devel 2001-09-03 ;;; is fixed now. (assert (equal (let ((hash (make-hash-table))) @@ -33,7 +35,8 @@ ;;; a bug reported and fixed by Alexey Dejneka sbcl-devel 2001-10-05: ;;; The type declarations should apply, hence under Python's ;;; declarations-are-assertions rule, the code should signal a type -;;; error. +;;; error. (Except when running interpreted code) +#+#.(cl:if (cl:eq sb-ext:*evaluator-mode* :compile) '(and) '(or)) (assert (typep (nth-value 1 (ignore-errors (funcall (lambda () @@ -177,6 +180,7 @@ (setf (gethash 7 ht) 15) (assert (= (loop for v fixnum being each hash-key in ht sum v) 8)) (assert (= (loop for v fixnum being each hash-value in ht sum v) 18)) + #+#.(cl:if (cl:eq sb-ext:*evaluator-mode* :compile) '(and) '(or)) (assert (raises-error? (loop for v float being each hash-value in ht sum v) type-error))) @@ -236,3 +240,48 @@ (macroexpand '(LOOP WITH A = 0 FOR A DOWNFROM 10 TO 0 DO (PRINT A)))) (declare (ignore _)) (assert (typep condition 'program-error))) + +;;; Loop variable with a range excluding 0, reported by Andras Simon. +;;; (Used to signal an error during macroexpansion.) +(assert (not (loop with foo of-type (single-float 1.0 2.0) = 1.5 do (return)))) + +;;; 1.0.26.12 used to signal a bogus type error for this. +(loop with x of-type (simple-vector 1) = (make-array '(1)) + repeat 1 + return x) + +(with-test (:name :bug-540186) + (let ((fun (compile nil `(lambda (x) + (loop for i from 0 below (length x) + for vec of-type vector = (aref x i) + collect vec))))) + (assert (equal '("foo" "bar") + (funcall fun + (vector "foo" "bar")))))) + +(with-test (:name :bug-lp613871) + (multiple-value-bind (function warnings-p failure-p) + (compile nil '(lambda () (loop with nil = 1 repeat 2 collect t))) + (assert (null warnings-p)) + (assert (null failure-p)) + (assert (equal '(t t) (funcall function)))) + (multiple-value-bind (function warnings-p failure-p) + (compile nil '(lambda () (loop with nil repeat 2 collect t))) + (assert (null warnings-p)) + (assert (null failure-p)) + (assert (equal '(t t) (funcall function))))) + +(with-test (:name :bug-654220-regression) + (assert (= 32640 (loop for i to 255 + sum i into sum of-type fixnum + finally (return sum))))) + +(with-test (:name :of-type-character-init) + ;; The intention here is to if we initialize C to NIL before iteration start + ;; by looking for tell-tale types such as (OR NULL CHARACTER). ...not the + ;; most robust test ever, no. + (let* ((fun (compile nil `(lambda (x) + (loop for c of-type character in x + collect (char-code c))))) + (consts (ctu:find-code-constants fun :type '(or symbol list)))) + (assert (or (null consts) (equal 'character consts)))))