Fix make-array transforms.
[sbcl.git] / tests / loop.pure.lisp
index 917731a..5cd85f3 100644 (file)
@@ -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 ()
   (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)))
 
       (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)))))