1 ;;;; various compiler tests without side effects
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; While most of SBCL is derived from the CMU CL system, the test
7 ;;;; files (like this one) were written from scratch after the fork
10 ;;;; This software is in the public domain and is provided with
11 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
12 ;;;; more information.
16 (defknown compiler-derived-type
(t) (values t t
) (movable flushable unsafe
))
18 (deftransform compiler-derived-type
((x))
19 `(values ',(type-specifier (lvar-type x
)) t
))
21 (defun compiler-derived-type (x)
24 (cl:in-package
:cl-user
)
26 ;; The tests in this file assume that EVAL will use the compiler
27 (when (eq sb-ext
:*evaluator-mode
* :interpret
)
28 (invoke-restart 'run-tests
::skip-file
))
30 ;;; Exercise a compiler bug (by crashing the compiler).
32 ;;; This test code is from Douglas Crosher's simplified TICKLE-BUG
33 ;;; (2000-09-06 on cmucl-imp).
35 ;;; The bug was fixed by Douglas Crosher's patch, massaged for SBCL by
36 ;;; Martin Atzmueller (2000-09-13 on sbcl-devel).
56 ;;; Exercise a compiler bug (by crashing the compiler).
58 ;;; Tim Moore gave a patch for this bug in CMU CL 2000-05-24 on
59 ;;; cmucl-imp, and Martin Atzmueller applied it to SBCL.
63 (block used-by-some-y?
67 (return-from used-by-some-y? t
)))))
68 (declare (inline frob
))
74 ;;; bug 112, reported by Martin Atzmueller 2001-06-25 (originally
75 ;;; from Bruno Haible in CMU CL bugs collection), fixed by
76 ;;; Alexey Dejneka 2002-01-27
77 (assert (= 1 ; (used to give 0 under bug 112)
82 (declare (special x
)) y
)))))
83 (assert (= 1 ; (used to give 1 even under bug 112, still works after fix)
88 (declare (special x
)) y
)))))
90 ;;; another LET-related bug fixed by Alexey Dejneka at the same
92 (multiple-value-bind (fun warnings-p failure-p
)
93 ;; should complain about duplicate variable names in LET binding
99 (declare (ignore warnings-p
))
100 (assert (functionp fun
))
103 ;;; bug 169 (reported by Alexey Dejneka 2002-05-12, fixed by David
104 ;;; Lichteblau 2002-05-21)
106 (multiple-value-bind (fun warnings-p failure-p
)
108 ;; Compiling this code should cause a STYLE-WARNING
109 ;; about *X* looking like a special variable but not
113 (funcall (symbol-function 'x-getter
))
115 (assert (functionp fun
))
117 (assert (not failure-p
)))
118 (multiple-value-bind (fun warnings-p failure-p
)
120 ;; Compiling this code should not cause a warning
121 ;; (because the DECLARE turns *X* into a special
122 ;; variable as its name suggests it should be).
125 (declare (special *x
*))
126 (funcall (symbol-function 'x-getter
))
128 (assert (functionp fun
))
129 (assert (not warnings-p
))
130 (assert (not failure-p
))))
132 ;;; a bug in 0.7.4.11
133 (dolist (i '(a b
1 2 "x" "y"))
134 ;; In sbcl-0.7.4.11, the compiler tried to source-transform the
135 ;; TYPEP here but got confused and died, doing
136 ;; (ASSOC '(AND INTEGERP (SATISFIES PLUSP)))
137 ;; *BACKEND-TYPE-PREDICATES*
139 ;; and blowing up because TYPE= tried to call PLUSP on the
140 ;; characters of the MEMBER-TYPE representing STANDARD-CHAR.
141 (when (typep i
'(and integer
(satisfies oddp
)))
144 (when (typep i
'(and integer
(satisfies oddp
)))
147 ;;; bug 156 (reported by APD sbcl-devel 2002-04-12, fixed by CSR patch
148 ;;; sbcl-devel 2002-07-02): FUNCTION-LAMBDA-EXPRESSION of
149 ;;; interactively-compiled functions was broken by sleaziness and
150 ;;; confusion in the assault on 0.7.0, so this expression used to
151 ;;; signal TYPE-ERROR when it found NIL instead of a DEBUG-SOURCE.
152 (eval '(function-lambda-expression #'(lambda (x) x
)))
154 ;;; bug caught and fixed by Raymond Toy cmucl-imp 2002-07-10: &REST
155 ;;; variable is not optional.
156 (assert (null (ignore-errors (eval '(funcall (lambda (&rest
) 12))))))
158 ;;; on the PPC, we got the magic numbers in undefined_tramp wrong for
159 ;;; a while; fixed by CSR 2002-07-18
160 (multiple-value-bind (value error
)
161 (ignore-errors (some-undefined-function))
162 (assert (null value
))
163 (assert (eq (cell-error-name error
) 'some-undefined-function
)))
165 ;;; Non-symbols shouldn't be allowed as VARs in lambda lists. (Where VAR
166 ;;; is a variable name, as in section 3.4.1 of the ANSI spec.)
167 (assert (null (ignore-errors (eval '(lambda ("foo") 12)))))
168 (assert (ignore-errors (eval '(lambda (foo) 12))))
169 (assert (null (ignore-errors (eval '(lambda (&optional
12) "foo")))))
170 (assert (ignore-errors (eval '(lambda (&optional twelve
) "foo"))))
171 (assert (null (ignore-errors (eval '(lambda (&optional
(12 12)) "foo")))))
172 (assert (ignore-errors (eval '(lambda (&optional
(twelve 12)) "foo"))))
173 (assert (null (ignore-errors (eval '(lambda (&key
#\c
) "foo")))))
174 (assert (ignore-errors (eval '(lambda (&key c
) "foo"))))
175 (assert (null (ignore-errors (eval '(lambda (&key
(#\c
#\c
)) "foo")))))
176 (assert (ignore-errors (eval '(lambda (&key
(c #\c
)) "foo"))))
177 (assert (null (ignore-errors (eval '(lambda (&key
((#\c
#\c
) #\c
)) "foo")))))
178 (assert (ignore-errors (eval '(lambda (&key
((:c cbyanyothername
) #\c
)) "foo"))))
180 ;;; As reported and fixed by Antonio Martinez-Shotton sbcl-devel
181 ;;; 2002-09-12, this failed in sbcl-0.7.7.23. (with failed AVER
182 ;;; "(LEAF-HAS-SOURCE-NAME-P LEAF)")
183 (assert (= (funcall (eval `(lambda (x) (funcall ,(lambda (y) (+ y
3)) x
))) 14)
186 ;;; bug 181: bad type specifier dropped compiler into debugger
187 (assert (list (compile nil
'(lambda (x)
188 (declare (type (0) x
))
191 (let ((f (compile nil
'(lambda (x)
192 (make-array 1 :element-type
'(0))))))
193 (assert (null (ignore-errors (funcall f
)))))
195 ;;; the following functions must not be flushable
196 (dolist (form '((make-sequence 'fixnum
10)
197 (concatenate 'fixnum nil
)
198 (map 'fixnum
#'identity nil
)
199 (merge 'fixnum nil nil
#'<)))
200 (assert (not (eval `(locally (declare (optimize (safety 0)))
201 (ignore-errors (progn ,form t
)))))))
203 (dolist (form '((values-list (car (list '(1 .
2))))
205 (atan #c
(1 1) (car (list #c
(2 2))))
206 (nthcdr (car (list (floor (cos 3)))) '(1 2 3 4 5))
207 (nthcdr (car (list 5)) '(1 2 .
3))))
208 (assert (not (eval `(locally (declare (optimize (safety 3)))
209 (ignore-errors (progn ,form t
)))))))
211 ;;; feature: we shall complain if functions which are only useful for
212 ;;; their result are called and their result ignored.
213 (loop for
(form expected-des
) in
214 '(((progn (nreverse (list 1 2)) t
)
215 "The return value of NREVERSE should not be discarded.")
216 ((progn (nreconc (list 1 2) (list 3 4)) t
)
217 "The return value of NRECONC should not be discarded.")
219 (declare (inline sort
))
220 (sort (list 1 2) #'<) t
)
221 ;; FIXME: it would be nice if this warned on non-inlined sort
222 ;; but the current simple boolean function attribute
223 ;; can't express the condition that would be required.
224 "The return value of STABLE-SORT-LIST should not be discarded.")
225 ((progn (sort (vector 1 2) #'<) t
)
226 ;; Apparently, SBCL (but not CL) guarantees in-place vector
227 ;; sort, so no warning.
229 ((progn (delete 2 (list 1 2)) t
)
230 "The return value of DELETE should not be discarded.")
231 ((progn (delete-if #'evenp
(list 1 2)) t
)
232 ("The return value of DELETE-IF should not be discarded."))
233 ((progn (delete-if #'evenp
(vector 1 2)) t
)
234 ("The return value of DELETE-IF should not be discarded."))
235 ((progn (delete-if-not #'evenp
(list 1 2)) t
)
236 "The return value of DELETE-IF-NOT should not be discarded.")
237 ((progn (delete-duplicates (list 1 2)) t
)
238 "The return value of DELETE-DUPLICATES should not be discarded.")
239 ((progn (merge 'list
(list 1 3) (list 2 4) #'<) t
)
240 "The return value of MERGE should not be discarded.")
241 ((progn (nreconc (list 1 3) (list 2 4)) t
)
242 "The return value of NRECONC should not be discarded.")
243 ((progn (nunion (list 1 3) (list 2 4)) t
)
244 "The return value of NUNION should not be discarded.")
245 ((progn (nintersection (list 1 3) (list 2 4)) t
)
246 "The return value of NINTERSECTION should not be discarded.")
247 ((progn (nset-difference (list 1 3) (list 2 4)) t
)
248 "The return value of NSET-DIFFERENCE should not be discarded.")
249 ((progn (nset-exclusive-or (list 1 3) (list 2 4)) t
)
250 "The return value of NSET-EXCLUSIVE-OR should not be discarded."))
251 for expected
= (if (listp expected-des
)
255 (multiple-value-bind (fun warnings-p failure-p
)
256 (handler-bind ((style-warning (lambda (c)
258 (let ((expect-one (pop expected
)))
259 (assert (search expect-one
260 (with-standard-io-syntax
261 (let ((*print-right-margin
* nil
))
262 (princ-to-string c
))))
264 "~S should have warned ~S, but instead warned: ~A"
266 (error "~S shouldn't give a(nother) warning, but did: ~A" form c
)))))
267 (compile nil
`(lambda () ,form
)))
268 (declare (ignore warnings-p
))
269 (assert (functionp fun
))
270 (assert (null expected
)
272 "~S should have warned ~S, but didn't."
274 (assert (not failure-p
))))
276 ;;; a bug in the MAP deftransform caused non-VECTOR array specifiers
277 ;;; to cause errors in the compiler. Fixed by CSR in 0.7.8.10
278 (assert (list (compile nil
'(lambda (x) (map 'simple-array
'identity x
)))))
280 ;;; bug 129: insufficient syntax checking in MACROLET
281 (multiple-value-bind (result error
)
282 (ignore-errors (eval '(macrolet ((foo x
`',x
)) (foo 1 2 3))))
283 (assert (null result
))
284 (assert (typep error
'error
)))
286 ;;; bug 124: environment of MACROLET-introduced macro expanders
288 (macrolet ((mext (x) `(cons :mext
,x
)))
289 (macrolet ((mint (y) `'(:mint
,(mext y
))))
292 '((:MEXT
1 2) (:MINT
(:MEXT
1 2)))))
294 ;;; bug 48c: SYMBOL-MACROLET should signal PROGRAM-ERROR if introduced
295 ;;; symbol is declared to be SPECIAL
296 (multiple-value-bind (result error
)
297 (ignore-errors (funcall (lambda ()
298 (symbol-macrolet ((s '(1 2)))
299 (declare (special s
))
301 (assert (null result
))
302 (assert (typep error
'program-error
)))
304 ;;; ECASE should treat a bare T as a literal key
305 (multiple-value-bind (result error
)
306 (ignore-errors (ecase 1 (t 0)))
307 (assert (null result
))
308 (assert (typep error
'type-error
)))
310 (multiple-value-bind (result error
)
311 (ignore-errors (ecase 1 (t 0) (1 2)))
312 (assert (eql result
2))
313 (assert (null error
)))
315 ;;; FTYPE should accept any functional type specifier
316 (compile nil
'(lambda (x) (declare (ftype function f
)) (f x
)))
318 ;;; FUNCALL of special operators and macros should signal an
319 ;;; UNDEFINED-FUNCTION error
320 (multiple-value-bind (result error
)
321 (ignore-errors (funcall 'quote
1))
322 (assert (null result
))
323 (assert (typep error
'undefined-function
))
324 (assert (eq (cell-error-name error
) 'quote
)))
325 (multiple-value-bind (result error
)
326 (ignore-errors (funcall 'and
1))
327 (assert (null result
))
328 (assert (typep error
'undefined-function
))
329 (assert (eq (cell-error-name error
) 'and
)))
331 ;;; PSETQ should behave when given complex symbol-macro arguments
332 (multiple-value-bind (sequence index
)
333 (symbol-macrolet ((x (aref a
(incf i
)))
334 (y (aref a
(incf i
))))
335 (let ((a (copy-seq #(0 1 2 3 4 5 6 7 8 9)))
337 (psetq x
(aref a
(incf i
))
340 (assert (equalp sequence
#(0 2 2 4 4 5 6 7 8 9)))
341 (assert (= index
4)))
343 (multiple-value-bind (result error
)
345 (let ((x (list 1 2)))
348 (assert (null result
))
349 (assert (typep error
'program-error
)))
351 ;;; COPY-SEQ should work on known-complex vectors:
353 (let ((v (make-array 0 :fill-pointer
0)))
354 (vector-push-extend 1 v
)
357 ;;; to support INLINE functions inside MACROLET, it is necessary for
358 ;;; FUNCTION-LAMBDA-EXPRESSION to return a proper lambda expression in
359 ;;; certain circumstances, one of which is when compile is called from
362 (function-lambda-expression
363 (compile nil
'(lambda (x) (block nil
(print x
)))))
364 '(lambda (x) (block nil
(print x
)))))
366 ;;; bug 62: too cautious type inference in a loop
371 (declare (optimize speed
(safety 0)))
373 (array (loop (print (car a
)))))))))
375 ;;; Bug reported by Robert E. Brown sbcl-devel 2003-02-02: compiler
378 '(lambda (key tree collect-path-p
)
379 (let ((lessp (key-lessp tree
))
380 (equalp (key-equalp tree
)))
381 (declare (type (function (t t
) boolean
) lessp equalp
))
383 (loop for node
= (root-node tree
)
384 then
(if (funcall lessp key
(node-key node
))
388 do
(return (values nil nil nil
))
389 do
(when collect-path-p
391 (when (funcall equalp key
(node-key node
))
392 (return (values node path t
))))))))
394 ;;; CONSTANTLY should return a side-effect-free function (bug caught
395 ;;; by Paul Dietz' test suite)
397 (let ((fn (constantly (progn (incf i
) 1))))
399 (assert (= (funcall fn
) 1))
401 (assert (= (funcall fn
) 1))
404 ;;; Bug 240 reported by tonyms on #lisp IRC 2003-02-25 (modified version)
405 (loop for
(fun warns-p
) in
406 '(((lambda (&optional
*x
*) *x
*) t
)
407 ((lambda (&optional
*x
* &rest y
) (values *x
* y
)) t
)
408 ((lambda (&optional
*print-length
*) (values *print-length
*)) nil
)
409 ((lambda (&optional
*print-length
* &rest y
) (values *print-length
* y
)) nil
)
410 ((lambda (&optional
*x
*) (declare (special *x
*)) (values *x
*)) nil
)
411 ((lambda (&optional
*x
* &rest y
) (declare (special *x
*)) (values *x
* y
)) nil
))
412 for real-warns-p
= (nth-value 1 (compile nil fun
))
413 do
(assert (eq warns-p real-warns-p
)))
415 ;;; Bug reported by Gilbert Baumann on #lisp IRC 2003-03-26
416 (assert (equal (funcall (eval '(lambda (x &optional
(y (pop x
))) (list x y
)))
420 ;;; Bug reported by Paul Dietz on cmucl-imp and fixed by Gerd
421 ;;; Moellmann: CONVERT-MORE-CALL failed on the following call
422 (assert (eq (eval '((lambda (&key
) 'u
) :allow-other-keys nil
)) 'u
))
425 (raises-error?
(multiple-value-bind (a b c
)
426 (eval '(truncate 3 4))
427 (declare (integer c
))
431 (assert (equal (multiple-value-list (the (values &rest integer
)
435 ;;; Bug relating to confused representation for the wild function
437 (assert (null (funcall (eval '(lambda () (multiple-value-list (values)))))))
439 ;;; &ENVIRONMENT parameter should be bound first (from Paul Dietz'
441 (assert (eql (macrolet ((foo () 1))
442 (macrolet ((%f
(&optional
(x (macroexpand '(foo) env
)) &environment env
)
447 ;;; MACROLET should check for duplicated names
448 (dolist (ll '((x (z x
))
449 (x y
&optional z x w
)
453 (x &optional
(y nil x
))
454 (x &optional
(y nil y
))
457 (&key
(y nil z
) (z nil w
))
458 (&whole x
&optional x
)
459 (&environment x
&whole x
)))
464 (macrolet ((foo ,ll nil
)
465 (bar (&environment env
)
466 `',(macro-function 'foo env
)))
469 (values nil t t
))))))
471 (assert (typep (eval `(the arithmetic-error
472 ',(make-condition 'arithmetic-error
)))
475 (assert (not (nth-value
476 2 (compile nil
'(lambda ()
477 (make-array nil
:initial-element
11))))))
479 (assert (raises-error?
(funcall (eval #'open
) "assertoid.lisp"
480 :external-format
'#:nonsense
)))
481 (assert (raises-error?
(funcall (eval #'load
) "assertoid.lisp"
482 :external-format
'#:nonsense
)))
484 (assert (= (the (values integer symbol
) (values 1 'foo
13)) 1))
486 (let ((f (compile nil
488 (declare (optimize (safety 3)))
489 (list (the fixnum
(the (real 0) (eval v
))))))))
490 (assert (raises-error?
(funcall f
0.1) type-error
))
491 (assert (raises-error?
(funcall f -
1) type-error
)))
493 ;;; the implicit block does not enclose lambda list
494 (let ((forms '((defmacro #1=#:foo
(&optional
(x (return-from #1#))))
495 #+nil
(macrolet ((#2=#:foo
(&optional
(x (return-from #2#))))))
496 (define-compiler-macro #3=#:foo
(&optional
(x (return-from #3#))))
497 (deftype #4=#:foo
(&optional
(x (return-from #4#))))
498 (define-setf-expander #5=#:foo
(&optional
(x (return-from #5#))))
499 (defsetf #6=#:foo
(&optional
(x (return-from #6#))) ()))))
501 (assert (nth-value 2 (compile nil
`(lambda () ,form
))))))
503 (assert (nth-value 2 (compile nil
505 (svref (make-array '(8 9) :adjustable t
) 1)))))
507 ;;; CHAR= did not check types of its arguments (reported by Adam Warner)
508 (raises-error?
(funcall (compile nil
'(lambda (x y z
) (char= x y z
)))
511 (raises-error?
(funcall (compile nil
513 (declare (optimize (speed 3) (safety 3)))
518 ;;; Compiler lost return type of MAPCAR and friends
519 (dolist (fun '(mapcar mapc maplist mapl
))
520 (assert (nth-value 2 (compile nil
522 (1+ (,fun
#'print x
)))))))
524 (assert (nth-value 2 (compile nil
526 (declare (notinline mapcar
))
527 (1+ (mapcar #'print
'(1 2 3)))))))
529 ;;; bug found by Paul Dietz: (SETF AREF) for bit vectors with constant
530 ;;; index was effectless
531 (let ((f (compile nil
'(lambda (a v
)
532 (declare (type simple-bit-vector a
) (type bit v
))
533 (declare (optimize (speed 3) (safety 0)))
536 (let ((y (make-array 2 :element-type
'bit
:initial-element
0)))
537 (assert (equal y
#*00))
539 (assert (equal y
#*10))))
541 ;;; use of declared array types
542 (handler-bind ((sb-ext:compiler-note
#'error
))
543 (compile nil
'(lambda (x)
544 (declare (type (simple-array (simple-string 3) (5)) x
)
546 (aref (aref x
0) 0))))
548 (handler-bind ((sb-ext:compiler-note
#'error
))
549 (compile nil
'(lambda (x)
550 (declare (type (simple-array (simple-array bit
(10)) (10)) x
)
552 (1+ (aref (aref x
0) 0)))))
555 (let ((f (compile nil
'(lambda (x) (typep x
'(not (member 0d0
)))))))
556 (assert (funcall f
1d0
)))
558 (compile nil
'(lambda (x)
559 (declare (double-float x
))
563 ;;; bogus optimization of BIT-NOT
564 (multiple-value-bind (result x
)
565 (eval '(let ((x (eval #*1001)))
566 (declare (optimize (speed 2) (space 3))
567 (type (bit-vector) x
))
568 (values (bit-not x nil
) x
)))
569 (assert (equal x
#*1001))
570 (assert (equal result
#*0110)))
572 ;;; the VECTOR type in CONCATENATE/MERGE/MAKE-SEQUENCE means (VECTOR T).
573 (handler-bind ((sb-ext:compiler-note
#'error
))
574 (assert (equalp (funcall
578 (let ((x (make-sequence 'vector
10 :initial-element
'a
)))
581 #(a a a a b a a a a a
))))
583 ;;; this is not a check for a bug, but rather a test of compiler
585 (dolist (type '((integer 0 *) ; upper bound
588 (real * (-10)) ; lower bound
593 (declare (optimize (speed 3) (compilation-speed 0)))
594 (loop for i from
1 to
(the (integer -
17 10) n
) by
2
595 collect
(when (> (random 10) 5)
596 (the ,type
(- i
11)))))))))
600 ;;; We suppose that INTEGER arithmetic cannot be efficient, and the
601 ;;; compiler has an optimized VOP for +; so this code should cause an
603 (assert (eq (block nil
605 (compile nil
'(lambda (i)
606 (declare (optimize speed
))
607 (declare (type integer i
))
609 (sb-ext:compiler-note
(c) (return :good
))))
612 ;;; bug 277: IGNORE/IGNORABLE declarations should be acceptable for
614 (assert (not (nth-value 1 (compile nil
'(lambda (u v
)
615 (symbol-macrolet ((x u
)
621 ;;; bug reported by Paul Dietz: wrong optimizer for (EXPT ... 0)
622 (loop for
(x type
) in
625 (-14/3 (rational -
8 11))
634 (#c
(-3 4) (complex fixnum
))
635 (#c
(-3 4) (complex rational
))
636 (#c
(-3/7 4) (complex rational
))
637 (#c
(2s0 3s0
) (complex short-float
))
638 (#c
(2f0 3f0
) (complex single-float
))
639 (#c
(2d0 3d0
) (complex double-float
))
640 (#c
(2l0 3l0) (complex long-float
))
641 (#c
(2d0 3s0
) (complex float
))
642 (#c
(2 3f0
) (complex real
))
643 (#c
(2 3d0
) (complex real
))
644 (#c
(-3/7 4) (complex real
))
647 do
(dolist (zero '(0 0s0
0f0
0d0
0l0))
648 (dolist (real-zero (list zero
(- zero
)))
649 (let* ((src `(lambda (x) (expt (the ,type x
) ,real-zero
)))
650 (fun (compile nil src
))
651 (result (1+ (funcall (eval #'*) x real-zero
))))
652 (assert (eql result
(funcall fun x
)))))))
654 ;;; (SIGNED-BYTE 1) [ returned from the logxor derive-type optimizer ]
655 ;;; wasn't recognized as a good type specifier.
656 (let ((fun (lambda (x y
)
657 (declare (type (integer -
1 0) x y
) (optimize speed
))
659 (assert (= (funcall fun
0 0) 0))
660 (assert (= (funcall fun
0 -
1) -
1))
661 (assert (= (funcall fun -
1 -
1) 0)))
663 ;;; from PFD's torture test, triggering a bug in our effective address
668 (declare (type (integer 8 22337) b
))
671 (* (logandc1 (max -
29303 b
) 4) b
)
672 (abs (logorc1 (+ (logandc1 -
11 b
) 2607688420) -
31153924)))
673 (logeqv (max a
0) b
))))
675 ;;; Alpha floating point modes weren't being reset after an exception,
676 ;;; leading to an exception on the second compile, below.
677 (compile nil
'(lambda (x y
) (declare (type (double-float 0.0d0
) x y
)) (/ x y
)))
678 (handler-case (/ 1.0 0.0)
679 ;; provoke an exception
680 (arithmetic-error ()))
681 (compile nil
'(lambda (x y
) (declare (type (double-float 0.0d0
) x y
)) (/ x y
)))
683 ;;; bug reported by Paul Dietz: component last block does not have
687 (declare (notinline + logand
)
688 (optimize (speed 0)))
692 (RETURN-FROM B5 -
220)))
694 (+ 359749 35728422))))
697 ;;; bug 294 reported by Paul Dietz: miscompilation of REM and MOD
698 (assert (= (funcall (compile nil
`(lambda (b)
699 (declare (optimize (speed 3))
700 (type (integer 2 152044363) b
))
701 (rem b
(min -
16 0))))
705 (assert (= (funcall (compile nil
`(lambda (c)
706 (declare (optimize (speed 3))
707 (type (integer 23062188 149459656) c
))
712 ;;; bug reported by Paul Dietz: block splitting inside FLUSH-DEAD-CODE
716 (LOGEQV (REM C -
6758)
717 (REM B
(MAX 44 (RETURN-FROM B6 A
)))))))
719 (compile nil
'(lambda ()
721 (flet ((foo (x y
) (if (> x y
) (print x
) (print y
))))
724 (foo (return 14) 2)))))
726 ;;; bug in Alpha backend: not enough sanity checking of arguments to
728 (assert (= (funcall (compile nil
735 ;;; bug found by WHN and pfdietz: compiler failure while referencing
736 ;;; an entry point inside a deleted lambda
737 (compile nil
'(lambda ()
742 (flet ((truly (fn bbd
)
746 (multiple-value-prog1
763 (wum #'bbfn
"hc3" (list)))
765 (compile nil
'(lambda () (flet ((%f
() (unwind-protect nil
))) nil
)))
767 ;;; the strength reduction of constant multiplication used (before
768 ;;; sbcl-0.8.4.x) to lie to the compiler. This meant that, under
769 ;;; certain circumstances, the compiler would derive that a perfectly
770 ;;; reasonable multiplication never returned, causing chaos. Fixed by
771 ;;; explicitly doing modular arithmetic, and relying on the backends
776 (declare (type (integer 178956970 178956970) x
)
782 ;;; bug in modular arithmetic and type specifiers
783 (assert (= (funcall (compile nil
(lambda (x) (logand x x
0)))
787 ;;; MISC.99 from Paul Dietz' random tester: FAST-ASH-MOD32-C VOP
788 ;;; produced wrong result for shift >=32 on X86
789 (assert (= 0 (funcall
792 (declare (type (integer 4303063 101130078) a
))
793 (mask-field (byte 18 2) (ash a
77))))
795 ;;; rewrite the test case to get the unsigned-byte 32/64
796 ;;; implementation even after implementing some modular arithmetic
797 ;;; with signed-byte 30:
798 (assert (= 0 (funcall
801 (declare (type (integer 4303063 101130078) a
))
802 (mask-field (byte 30 2) (ash a
77))))
804 (assert (= 0 (funcall
807 (declare (type (integer 4303063 101130078) a
))
808 (mask-field (byte 64 2) (ash a
77))))
810 ;;; and a similar test case for the signed masking extension (not the
811 ;;; final interface, so change the call when necessary):
812 (assert (= 0 (funcall
815 (declare (type (integer 4303063 101130078) a
))
816 (sb-c::mask-signed-field
30 (ash a
77))))
818 (assert (= 0 (funcall
821 (declare (type (integer 4303063 101130078) a
))
822 (sb-c::mask-signed-field
61 (ash a
77))))
825 ;;; MISC.101 and MISC.103: FLUSH-DEST did not mark the USE's block for
826 ;;; type check regeneration
827 (assert (eql (funcall
828 (compile nil
'(lambda (a c
)
829 (declare (type (integer 185501219873 303014665162) a
))
830 (declare (type (integer -
160758 255724) c
))
831 (declare (optimize (speed 3)))
833 (- -
554046873252388011622614991634432
835 (unwind-protect 2791485))))
836 (max (ignore-errors a
)
837 (let ((v6 (- v8
(restart-case 980))))
841 (assert (eql (funcall
842 (compile nil
'(lambda (a b
)
850 (load-time-value -
6876935))))
851 (if (logbitp 1 a
) b
(setq a -
1522022182249))))))))
852 -
1802767029877 -
12374959963)
855 ;;; various MISC.*, related to NODEs/LVARs with derived type NIL
856 (assert (eql (funcall (compile nil
'(lambda (c)
857 (declare (type (integer -
3924 1001809828) c
))
858 (declare (optimize (speed 3)))
859 (min 47 (if (ldb-test (byte 2 14) c
)
861 (ignore-errors -
732893970)))))
864 (assert (eql (funcall
865 (compile nil
'(lambda (b)
866 (declare (type (integer -
1598566306 2941) b
))
867 (declare (optimize (speed 3)))
868 (max -
148949 (ignore-errors b
))))
871 (assert (eql (funcall
872 (compile nil
'(lambda (b c
)
873 (declare (type (integer -
4 -
3) c
))
875 (flet ((%f1
(f1-1 f1-2 f1-3
)
876 (if (logbitp 0 (return-from b7
877 (- -
815145138 f1-2
)))
878 (return-from b7 -
2611670)
880 (let ((v2 (%f1 -
2464 (%f1 -
1146 c c
) -
2)))
884 (assert (eql (funcall
887 (declare (type (integer -
29742055786 23602182204) b
))
888 (declare (type (integer -
7409 -
2075) c
))
889 (declare (optimize (speed 3)))
893 (ignore-errors (return-from b6
894 (if (= c
8) b
82674))))))
898 (assert (equal (multiple-value-list
900 (compile nil
'(lambda (a)
901 (declare (type (integer -
944 -
472) a
))
902 (declare (optimize (speed 3)))
906 (if (= 55957 a
) -
117 (ignore-errors
907 (return-from b3 a
))))))))
912 (assert (zerop (funcall
915 (declare (type (integer 79828 2625480458) a
))
916 (declare (type (integer -
4363283 8171697) b
))
917 (declare (type (integer -
301 0) c
))
918 (if (equal 6392154 (logxor a b
))
922 (logior (logandc2 c v5
)
923 (common-lisp:handler-case
924 (ash a
(min 36 22477)))))))))
927 ;;; MISC.152, 153: deleted code and iteration var type inference
928 (assert (eql (funcall
932 (let ((v1 (let ((v8 (unwind-protect 9365)))
936 (labels ((%f11
(f11-1) f11-1
))
940 (labels ((%f6
(f6-1 f6-2 f6-3
) v1
))
941 (dpb (unwind-protect a
)
943 (labels ((%f4
() 27322826))
944 (%f6 -
2 -
108626545 (%f4
))))))))))))
948 (assert (eql (funcall
953 ((-96879 -
1035 -
57680 -
106404 -
94516 -
125088)
954 (unwind-protect 90309179))
955 ((-20811 -
86901 -
9368 -
98520 -
71594)
956 (let ((v9 (unwind-protect 136707)))
959 (let ((v4 (return-from b3 v9
)))
960 (- (ignore-errors (return-from b3 v4
))))))))
968 (assert (eql (funcall
979 &optional
(f17-4 185155520) (f17-5 c
)
982 (%f17 -
1046 a
1115306 (%f17 b -
146330 422) -
337817)))
983 (f15-5 a
) (f15-6 -
40))
984 (return-from b3 -
16)))
985 (multiple-value-call #'%f15
(values -
519354 a
121 c -
1905))))))
990 (assert (eql (funcall
994 (declare (notinline list apply
))
995 (declare (optimize (safety 3)))
996 (declare (optimize (speed 0)))
997 (declare (optimize (debug 0)))
998 (labels ((%f12
(f12-1 f12-2
)
999 (labels ((%f2
(f2-1 f2-2
)
1006 (return-from %f12 b
)))
1009 (%f18
(%f18
150 -
64 f12-1
)
1016 &optional
(f7-3 (%f6
)))
1019 (%f2 b -
36582571))))
1020 (apply #'%f12
(list 774 -
4413)))))
1025 (assert (eql (funcall
1029 (declare (notinline values
))
1030 (declare (optimize (safety 3)))
1031 (declare (optimize (speed 0)))
1032 (declare (optimize (debug 0)))
1035 &optional
(f11-3 c
) (f11-4 7947114)
1037 (flet ((%f3
(f3-1 &optional
(f3-2 b
) (f3-3 5529))
1039 (multiple-value-call #'%f3
1040 (values (%f3 -
30637724 b
) c
)))))
1042 (if (and nil
(%f11 a a
))
1043 (if (%f11 a
421778 4030 1)
1049 (%f11 c a c -
4 214720)
1061 ;;; MISC.177, 182: IR2 copy propagation missed a hidden write to a
1062 ;;; local lambda argument
1068 (declare (type (integer 804561 7640697) a
))
1069 (declare (type (integer -
1 10441401) b
))
1070 (declare (type (integer -
864634669 55189745) c
))
1071 (declare (ignorable a b c
))
1072 (declare (optimize (speed 3)))
1073 (declare (optimize (safety 1)))
1074 (declare (optimize (debug 1)))
1077 (labels ((%f4
() (round 200048 (max 99 c
))))
1080 (labels ((%f3
(f3-1) -
162967612))
1081 (%f3
(let* ((v8 (%f4
)))
1082 (setq f11-1
(%f4
)))))))))
1083 (%f11 -
120429363 (%f11
62362 b
)))))
1084 6714367 9645616 -
637681868)
1087 ;;; Bug reported by Paul F. Dietz caused by derive type loss in VALUE
1089 (assert (equal (multiple-value-list
1091 (compile nil
'(lambda ()
1092 (declare (optimize (speed 1) (space 0) (safety 3) (debug 3) (compilation-speed 1)))
1095 (flet ((%f16
() 0)) (%f16
))))))))
1104 (declare (type (integer 867934833 3293695878) a
))
1105 (declare (type (integer -
82111 1776797) b
))
1106 (declare (type (integer -
1432413516 54121964) c
))
1107 (declare (optimize (speed 3)))
1108 (declare (optimize (safety 1)))
1109 (declare (optimize (debug 1)))
1111 (flet ((%f15
(f15-1 &optional
(f15-2 c
))
1112 (labels ((%f1
(f1-1 f1-2
) 0))
1115 (multiple-value-call #'%f15
1116 (values (%f15 c
0) (%f15
0)))))
1118 (flet ((%f8
(f8-1 &optional
(f8-2 (%f4
)) (f8-3 0))
1122 3040851270 1664281 -
1340106197)))
1130 (declare (notinline <=))
1131 (declare (optimize (speed 2) (space 3) (safety 0)
1132 (debug 1) (compilation-speed 3)))
1133 (if (if (<= 0) nil nil
)
1134 (labels ((%f9
(f9-1 f9-2 f9-3
)
1136 (dotimes (iv4 5 a
) (%f9
0 0 b
)))
1140 ;;; MISC.259-264 (aka "CSR screwed up implementing *-MOD32")
1146 (declare (type (integer 177547470 226026978) a
))
1147 (declare (optimize (speed 3) (space 0) (safety 0) (debug 0)
1148 (compilation-speed 1)))
1149 (logand a
(* a
438810))))
1154 ;;;; Bugs in stack analysis
1155 ;;; bug 299 (reported by PFD)
1161 (declare (optimize (debug 1)))
1162 (multiple-value-call #'list
1163 (if (eval t
) (eval '(values :a
:b
:c
)) nil
)
1164 (catch 'foo
(throw 'foo
(values :x
:y
)))))))
1166 ;;; bug 298 (= MISC.183)
1167 (assert (zerop (funcall
1171 (declare (type (integer -
368154 377964) a
))
1172 (declare (type (integer 5044 14959) b
))
1173 (declare (type (integer -
184859815 -
8066427) c
))
1174 (declare (ignorable a b c
))
1175 (declare (optimize (speed 3)))
1176 (declare (optimize (safety 1)))
1177 (declare (optimize (debug 1)))
1179 (flet ((%f3
(f3-1 f3-2 f3-3
) 0))
1180 (apply #'%f3
0 (catch 'foo
(return-from b7
(%f3
0 b c
))) c nil
)))))
1182 (assert (equal (eval '(let () (apply #'list
1 (list (catch 'a
(throw 'a
(block b
2)))))))
1188 (multiple-value-call #'list
1192 (multiple-value-call #'list
1198 (return-from quux
1)
1199 (throw 'baz
2))))))))))))))
1200 (assert (equal (funcall f t
) '(:b
1)))
1201 (assert (equal (funcall f nil
) '(:a
2))))
1209 (declare (type (integer 5 155656586618) a
))
1210 (declare (type (integer -
15492 196529) b
))
1211 (declare (type (integer 7 10) c
))
1212 (declare (optimize (speed 3)))
1213 (declare (optimize (safety 1)))
1214 (declare (optimize (debug 1)))
1217 &optional
(f3-4 a
) (f3-5 0)
1219 (labels ((%f10
(f10-1 f10-2 f10-3
)
1224 (- (if (equal a b
) b
(%f10 c a
0))
1225 (catch 'ct2
(throw 'ct2 c
)))
1228 (%f3
(%f3
(%f3 b
0 0 0) a
0) a b b b c
)))) 5 0 7)
1233 '(let* ((form '(labels ((%f3
(f3-1 f3-2
) f3-1
))
1234 (apply #'%f3 b
(catch 'ct8
(throw 'ct8
(logeqv (%f3 c
0)))) nil
)))
1237 (declare (type (integer -
2 19) b
)
1238 (type (integer -
1520 218978) c
)
1239 (optimize (speed 3) (safety 1) (debug 1)))
1242 (declare (notinline logeqv apply
)
1243 (optimize (safety 3) (speed 0) (debug 0)))
1245 (cf1 (compile nil fn1
))
1246 (cf2 (compile nil fn2
))
1247 (result1 (multiple-value-list (funcall cf1
2 18886)))
1248 (result2 (multiple-value-list (funcall cf2
2 18886))))
1249 (if (equal result1 result2
)
1251 (values result1 result2
))))
1261 (optimize (speed 3) (space 3) (safety 1)
1262 (debug 2) (compilation-speed 0)))
1263 (apply (constantly 0) (catch 'ct2
0) 0 (catch 'ct2
0) nil
))))))
1266 (assert (zerop (funcall
1270 (declare (optimize (speed 2) (space 0) (safety 3) (debug 1)
1271 (compilation-speed 2)))
1272 (apply (constantly 0)
1276 (apply (constantly 0)
1295 (declare (optimize (speed 1) (space 0) (safety 0) (debug 0)))
1296 (multiple-value-prog1
1297 (the integer
(catch 'ct8
(catch 'ct7
15867134)))
1298 (catch 'ct1
(throw 'ct1
0))))))
1301 ;;; misc.361: replacing CAST with (m-v-call #'%compile-time-type-error)
1302 ;;; could transform known-values LVAR to UVL
1303 (assert (zerop (funcall
1307 (declare (notinline boole values denominator list
))
1313 (compilation-speed 2)))
1318 (let ((v9 (ignore-errors (throw 'ct6
0))))
1320 (progv nil nil
(values (boole boole-and
0 v9
)))))))))
1323 ;;; non-continuous dead UVL blocks
1324 (defun non-continuous-stack-test (x)
1325 (multiple-value-call #'list
1326 (eval '(values 11 12))
1327 (eval '(values 13 14))
1329 (return-from non-continuous-stack-test
1330 (multiple-value-call #'list
1331 (eval '(values :b1
:b2
))
1332 (eval '(values :b3
:b4
))
1335 (multiple-value-call (eval #'values
)
1336 (eval '(values 1 2))
1337 (eval '(values 3 4))
1340 (multiple-value-call (eval #'values
)
1341 (eval '(values :a1
:a2
))
1342 (eval '(values :a3
:a4
))
1345 (multiple-value-call (eval #'values
)
1346 (eval '(values 5 6))
1347 (eval '(values 7 8))
1350 (return-from int
:int
))))))))))))))))
1351 (assert (equal (non-continuous-stack-test t
) '(11 12 13 14 1 2 3 4 5 6 7 8 :ext
)))
1352 (assert (equal (non-continuous-stack-test nil
) '(:b1
:b2
:b3
:b4
:a1
:a2
:a3
:a4
:int
)))
1354 ;;; MISC.362: environment of UNWIND-PROTECTor is different from that
1356 (assert (equal (multiple-value-list (funcall
1360 (declare (optimize (speed 3) (space 3) (safety 2)
1361 (debug 2) (compilation-speed 3)))
1364 (labels ((%f15
(f15-1 f15-2 f15-3
)
1365 (rational (throw 'ct5
0))))
1371 (progv '(*s2
* *s5
*) (list 0 (%f15
0 g
0)) b
)
1375 (common-lisp:handler-case
0)))))
1387 (declare (notinline funcall min coerce
))
1393 (compilation-speed 1)))
1394 (flet ((%f12
(f12-1)
1397 (if f12-1
(multiple-value-prog1
1398 b
(return-from %f12
0))
1401 (funcall #'%f12
0))))
1404 ;;; Discussion of a CMUCL PCL bug on Sparc with Raymond Toy revealed a
1405 ;;; potential problem: optimizers and type derivers for MAX and MIN
1406 ;;; were not consistent in treating EQUALP, but not EQL, arguments.
1407 (dolist (f '(min max
))
1408 (loop for complex-arg-args in
'((1d0 2d0
) (0d0 1d0
))
1409 for complex-arg
= `(if x
,@complex-arg-args
)
1411 (loop for args in
`((1 ,complex-arg
)
1413 for form
= `(,f
,@args
)
1414 for f1
= (compile nil
`(lambda (x) ,form
))
1415 and f2
= (compile nil
`(lambda (x) (declare (notinline min max
))
1418 (dolist (x '(nil t
))
1419 (assert (eql (funcall f1 x
) (funcall f2 x
)))))))
1422 (handler-case (compile nil
'(lambda (x)
1423 (declare (optimize (speed 3) (safety 0)))
1424 (the double-float
(sqrt (the double-float x
)))))
1425 (sb-ext:compiler-note
(c)
1426 ;; Ignore the note for the float -> pointer conversion of the
1428 (unless (string= (car (last (sb-c::simple-condition-format-arguments c
)))
1430 (error "Compiler does not trust result type assertion."))))
1432 (let ((f (compile nil
'(lambda (x)
1433 (declare (optimize speed
(safety 0)))
1436 (multiple-value-prog1
1437 (sqrt (the double-float x
))
1439 (return :minus
)))))))))
1440 (assert (eql (funcall f -
1d0
) :minus
))
1441 (assert (eql (funcall f
4d0
) 2d0
)))
1443 ;;; bug 304: SBCL produced something similar to (/ (ASH x 4) 8)
1445 (compile nil
'(lambda (a i
)
1447 (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)
1448 (inhibit-warnings 0)))
1449 (declare (type (alien (* (unsigned 8))) a
)
1450 (type (unsigned-byte 32) i
))
1452 (compiler-note () (error "The code is not optimized.")))
1455 (compile nil
'(lambda (x)
1456 (declare (type (integer -
100 100) x
))
1457 (declare (optimize speed
))
1458 (declare (notinline identity
))
1460 (compiler-note () (error "IDENTITY derive-type not applied.")))
1462 (assert (null (funcall (compile nil
'(lambda (x) (funcall #'cddr x
))) nil
)))
1464 ;;; MISC.293 = easy variant of bug 303: repeated write to the same
1465 ;;; LVAR; here the first write may be cleared before the second is
1473 (declare (notinline complex
))
1474 (declare (optimize (speed 1) (space 0) (safety 1)
1475 (debug 3) (compilation-speed 3)))
1476 (flet ((%f
() (multiple-value-prog1 0 (return-from %f
0))))
1477 (complex (%f
) 0)))))))
1479 ;;; MISC.110A: CAST optimizer forgot to flush LVAR derived type
1480 (assert (zerop (funcall
1484 (declare (type (integer -
1294746569 1640996137) a
))
1485 (declare (type (integer -
807801310 3) c
))
1486 (declare (optimize (speed 3) (space 3) (safety 0) (debug 0) (compilation-speed 3)))
1493 (progn (if (ldb-test (byte 0 0) (rational (throw 'ct7
0))) 0 0) 0))))
1495 391833530 -
32785211)))
1497 ;;; efficiency notes for ordinary code
1498 (macrolet ((frob (arglist &body body
)
1501 (compile nil
'(lambda ,arglist
,@body
))
1502 (sb-ext:compiler-note
(e)
1503 (error "bad compiler note for ~S:~% ~A" ',body e
)))
1506 (compile nil
'(lambda ,arglist
(declare (optimize speed
))
1508 (sb-ext:compiler-note
(e) (throw :got-note nil
)))
1509 (error "missing compiler note for ~S" ',body
)))))
1510 (frob (x) (funcall x
))
1511 (frob (x y
) (find x y
))
1512 (frob (x y
) (find-if x y
))
1513 (frob (x y
) (find-if-not x y
))
1514 (frob (x y
) (position x y
))
1515 (frob (x y
) (position-if x y
))
1516 (frob (x y
) (position-if-not x y
))
1517 (frob (x) (aref x
0)))
1519 (macrolet ((frob (style-warn-p form
)
1521 `(catch :got-style-warning
1524 (style-warning (e) (throw :got-style-warning nil
)))
1525 (error "missing style-warning for ~S" ',form
))
1529 (error "bad style-warning for ~S: ~A" ',form e
))))))
1530 (frob t
(lambda (x &optional y
&key z
) (list x y z
)))
1531 (frob nil
(lambda (x &optional y z
) (list x y z
)))
1532 (frob nil
(lambda (x &key y z
) (list x y z
)))
1533 (frob t
(defgeneric #:foo
(x &optional y
&key z
)))
1534 (frob nil
(defgeneric #:foo
(x &optional y z
)))
1535 (frob nil
(defgeneric #:foo
(x &key y z
)))
1536 (frob t
(defun #:foo
(x) (flet ((foo (x &optional y
&key z
) (list x y z
))) (foo x x
:z x
)))))
1538 ;;; this was a bug in the LOGXOR type deriver. The top form gave a
1539 ;;; note, because the system failed to derive the fact that the return
1540 ;;; from LOGXOR was small and negative, though the bottom one worked.
1541 (handler-bind ((sb-ext:compiler-note
#'error
))
1542 (compile nil
'(lambda ()
1543 (declare (optimize speed
(safety 0)))
1545 (declare (type (integer 3 6) x
)
1546 (type (integer -
6 -
3) y
))
1547 (+ (logxor x y
) most-positive-fixnum
)))))
1548 (handler-bind ((sb-ext:compiler-note
#'error
))
1549 (compile nil
'(lambda ()
1550 (declare (optimize speed
(safety 0)))
1552 (declare (type (integer 3 6) y
)
1553 (type (integer -
6 -
3) x
))
1554 (+ (logxor x y
) most-positive-fixnum
)))))
1556 ;;; check that modular ash gives the right answer, to protect against
1557 ;;; possible misunderstandings about the hardware shift instruction.
1558 (assert (zerop (funcall
1559 (compile nil
'(lambda (x y
)
1560 (declare (optimize speed
)
1561 (type (unsigned-byte 32) x y
))
1562 (logand #xffffffff
(ash x y
))))
1565 ;;; code instrumenting problems
1568 (declare (optimize (debug 3)))
1569 (list (the integer
(if nil
14 t
)))))
1573 (DECLARE (NOTINLINE LOGORC1 BYTE MASK-FIELD
))
1579 (COMPILATION-SPEED 0)))
1580 (MASK-FIELD (BYTE 7 26)
1582 (TAGBODY (THE INTEGER
(CATCH 'CT4
(LOGORC1 C -
15950))) 1)
1586 '(lambda (buffer i end
)
1587 (declare (optimize (debug 3)))
1588 (loop (when (not (eql 0 end
)) (return)))
1589 (let ((s (make-string end
)))
1590 (setf (schar s i
) (schar buffer i
))
1593 ;;; check that constant string prefix and suffix don't cause the
1594 ;;; compiler to emit code deletion notes.
1595 (handler-bind ((sb-ext:code-deletion-note
#'error
))
1596 (compile nil
'(lambda (s x
)
1597 (pprint-logical-block (s x
:prefix
"(")
1599 (compile nil
'(lambda (s x
)
1600 (pprint-logical-block (s x
:per-line-prefix
";")
1602 (compile nil
'(lambda (s x
)
1603 (pprint-logical-block (s x
:suffix
">")
1606 ;;; MISC.427: loop analysis requires complete DFO structure
1607 (assert (eql 17 (funcall
1611 (declare (notinline list reduce logior
))
1612 (declare (optimize (safety 2) (compilation-speed 1)
1613 (speed 3) (space 2) (debug 2)))
1615 (let* ((v5 (reduce #'+ (list 0 a
))))
1616 (declare (dynamic-extent v5
))
1621 (assert (zerop (funcall
1625 (declare (type (integer -
8431780939320 1571817471932) a
))
1626 (declare (type (integer -
4085 0) b
))
1627 (declare (ignorable a b
))
1630 (compilation-speed 0)
1631 #+sbcl
(sb-c:insert-step-conditions
0)
1638 (elt '(1954479092053)
1642 (lognand iv1
(ash iv1
(min 53 iv1
)))
1645 -
7639589303599 -
1368)))
1650 (declare (type (integer) a
))
1651 (declare (type (integer) b
))
1652 (declare (ignorable a b
))
1653 (declare (optimize (space 2) (compilation-speed 0)
1654 (debug 0) (safety 0) (speed 3)))
1656 (when (< iv1
2) (print 'x
)) ;; request for second constraint propagation pass
1657 (print (if (< iv1 iv1
)
1658 (logand (ash iv1 iv1
) 1)
1661 ;;; MISC.435: lambda var substitution in a deleted code.
1662 (assert (zerop (funcall
1666 (declare (notinline aref logandc2 gcd make-array
))
1668 (optimize (space 0) (safety 0) (compilation-speed 3)
1669 (speed 3) (debug 1)))
1672 (let* ((v2 (make-array nil
:initial-element
(catch 'ct1
(go tag2
)))))
1673 (declare (dynamic-extent v2
))
1674 (gcd (go tag2
) (logandc2 (catch 'ct2 c
) (aref v2
))))
1677 3021871717588 -
866608 -
2 -
17194)))
1679 ;;; MISC.436, 438: lost reoptimization
1680 (assert (zerop (funcall
1684 (declare (type (integer -
2917822 2783884) a
))
1685 (declare (type (integer 0 160159) b
))
1686 (declare (ignorable a b
))
1688 (optimize (compilation-speed 1)
1692 ; #+sbcl (sb-c:insert-step-conditions 0)
1706 '(-10197561 486 430631291
1712 (assert (zerop (funcall
1716 (declare (type (integer 0 1696) a
))
1717 ; (declare (ignorable a))
1718 (declare (optimize (space 2) (debug 0) (safety 1)
1719 (compilation-speed 0) (speed 1)))
1720 (if (logbitp 0 (ash (1- a
) (min 11 a
))) 0 0)))
1727 (declare (type (simple-array function
(2)) s
) (type ei ei
))
1728 (funcall (aref s ei
) x y
))))
1730 ;;; MISC.320: ir1-transform can create an intercomponent reference to
1732 (assert (eql 102 (funcall
1736 (declare (optimize (speed 3) (space 0) (safety 2)
1737 (debug 2) (compilation-speed 0)))
1740 (flet ((%f12
() (rem 0 -
43)))
1741 (multiple-value-call #'%f12
(values))))))))))
1743 ;;; MISC.437: lost reoptimization after FLUSH-DEST
1744 (assert (zerop (funcall
1747 '(lambda (a b c d e
)
1748 (declare (notinline values complex eql
))
1750 (optimize (compilation-speed 3)
1757 &optional
(f10-4 (ignore-errors 0)) (f10-5 0)
1758 &key
&allow-other-keys
)
1759 (if (or (eql 0 0) t
) 0 (if f10-1
0 0))))
1760 (complex (multiple-value-call #'%f10
(values a c b
0 0)) 0))))
1761 80043 74953652306 33658947 -
63099937105 -
27842393)))
1763 ;;; bug #351 -- program-error for malformed LET and LET*, including those
1764 ;;; resulting from SETF of LET.
1765 (dolist (fun (list (compile nil
'(lambda () (let :bogus-let
:oops
)))
1766 (compile nil
'(lambda () (let* :bogus-let
* :oops
)))
1767 (compile nil
'(lambda (x) (push x
(let ((y 0)) y
))))))
1768 (assert (functionp fun
))
1769 (multiple-value-bind (res err
) (ignore-errors (funcall fun
))
1771 (assert (typep err
'program-error
))))
1773 (let ((fun (compile nil
'(lambda (x) (random (if x
10 20))))))
1774 (dotimes (i 100 (error "bad RANDOM distribution"))
1775 (when (> (funcall fun nil
) 9)
1778 (when (> (funcall fun t
) 9)
1779 (error "bad RANDOM event"))))
1781 ;;; 0.8.17.28-sma.1 lost derived type information.
1782 (with-test (:name
"0.8.17.28-sma.1" :fails-on
:sparc
)
1783 (handler-bind ((sb-ext:compiler-note
(lambda (c) (error "~A" c
))))
1786 (declare (optimize (speed 3) (safety 0)))
1787 (declare (type (integer 0 80) x
)
1788 (type (integer 0 11) y
)
1789 (type (simple-array (unsigned-byte 32) (*)) v
))
1790 (setf (aref v
0) (* (* x
#.
(floor (ash 1 32) (* 11 80))) y
))
1793 ;;; Bug reported by Robert J. Macomber: instrumenting of more-entry
1794 ;;; prevented open coding of %LISTIFY-REST-ARGS.
1795 (let ((f (compile nil
'(lambda ()
1796 (declare (optimize (debug 3)))
1797 (with-simple-restart (blah "blah") (error "blah"))))))
1798 (handler-bind ((error (lambda (c) (invoke-restart 'blah
))))
1799 (assert (equal (multiple-value-list (funcall f
)) '(nil t
)))))
1801 ;;; Bug reported by Timmy Douglas: overflow in bit vector setter with
1802 ;;; constant index and value.
1803 (loop for n-bits
= 1 then
(* n-bits
2)
1804 for type
= `(unsigned-byte ,n-bits
)
1805 and v-max
= (1- (ash 1 n-bits
))
1806 while
(<= n-bits sb-vm
:n-word-bits
)
1808 (let* ((n (* 2 (1+ (- sb-vm
::n-word-bits n-bits
))))
1809 (array1 (make-array n
:element-type type
))
1810 (array2 (make-array n
:element-type type
)))
1812 (dolist (v (list 0 v-max
))
1813 (let ((f (compile nil
`(lambda (a)
1814 (declare (type (simple-array ,type
(,n
)) a
))
1815 (setf (aref a
,i
) ,v
)))))
1816 (fill array1
(- v-max v
))
1817 (fill array2
(- v-max v
))
1819 (setf (aref array2 i
) v
)
1820 (assert (every #'= array1 array2
)))))))
1822 (let ((fn (compile nil
'(lambda (x)
1823 (declare (type bit x
))
1824 (declare (optimize speed
))
1825 (let ((b (make-array 64 :element-type
'bit
1826 :initial-element
0)))
1828 (assert (= (funcall fn
0) 64))
1829 (assert (= (funcall fn
1) 0)))
1831 (let ((fn (compile nil
'(lambda (x y
)
1832 (declare (type simple-bit-vector x y
))
1833 (declare (optimize speed
))
1837 (make-array 64 :element-type
'bit
:initial-element
0)
1838 (make-array 64 :element-type
'bit
:initial-element
0)))
1842 (make-array 64 :element-type
'bit
:initial-element
0)
1843 (let ((b (make-array 64 :element-type
'bit
:initial-element
0)))
1844 (setf (sbit b
63) 1)
1847 ;;; MISC.535: compiler failure
1848 (let ((c0 #c
(4196.088977268509d0 -
15943.3603515625d0
)))
1849 (assert (not (funcall
1853 (declare (optimize speed
(safety 1))
1856 (eql (the (complex double-float
) p1
) p2
)))
1857 c0
#c
(12 612/979)))))
1859 ;;; reported by Lutz Euler: we shouldn't signal a compiler note for
1860 ;;; simple-bit-vector functions.
1861 (handler-bind ((sb-ext:compiler-note
#'error
))
1862 (compile nil
'(lambda (x)
1863 (declare (type simple-bit-vector x
))
1865 (handler-bind ((sb-ext:compiler-note
#'error
))
1866 (compile nil
'(lambda (x y
)
1867 (declare (type simple-bit-vector x y
))
1870 ;;; MISC.550: CAST merging in IR1 finalization caused unexpected
1871 ;;; code transformations.
1872 (assert (eql (funcall
1876 (declare (optimize (speed 3) (safety 2) (debug 3) (space 3))
1879 (or p1
(the (eql t
) p2
))))
1883 ;;; MISC.548: type check weakening converts required type into
1890 (declare (optimize (speed 2) (safety 1) (debug 3) (space 2)))
1891 (atom (the (member f assoc-if write-line t w
) p1
))))
1894 ;;; Free special bindings only apply to the body of the binding form, not
1895 ;;; the initialization forms.
1897 (funcall (compile 'nil
1900 (declare (special x
))
1902 ((lambda (&optional
(y x
))
1903 (declare (special x
)) y
)))))))))
1905 ;;; Bug from pfdietz's random tester: the compiler knew that IMAGPART of
1906 ;;; a rational was zero, but didn't do the substitution, leading to a
1907 ;;; crash in the ASH vop (since a shift of 57 wouldn't fit in the
1908 ;;; machine's ASH instruction's immediate field) that the compiler
1909 ;;; thought was legitimate.
1911 ;;; FIXME: this has been recorded as bug 383. The attempted fix (sbcl
1912 ;;; 0.9.2.6) led to lots of spurious optimization notes. So the bug stil
1913 ;;; exist and this test case serves as a reminder of the problem.
1914 ;;; --njf, 2005-07-05
1918 (DECLARE (TYPE (INTEGER -
2 14) B
))
1919 (DECLARE (IGNORABLE B
))
1920 (ASH (IMAGPART B
) 57)))
1922 ;;; bug reported by Eduardo Mu\~noz
1923 (multiple-value-bind (fun warnings failure
)
1924 (compile nil
'(lambda (struct first
)
1925 (declare (optimize speed
))
1926 (let* ((nodes (nodes struct
))
1927 (bars (bars struct
))
1928 (length (length nodes
))
1929 (new (make-array length
:fill-pointer
0)))
1930 (vector-push first new
)
1931 (loop with i fixnum
= 0
1932 for newl fixnum
= (length new
)
1933 while
(< newl length
) do
1934 (let ((oldl (length new
)))
1935 (loop for j fixnum from i below newl do
1936 (dolist (n (node-neighbours (aref new j
) bars
))
1937 (unless (find n new
)
1938 (vector-push n new
))))
1941 (declare (ignore fun warnings failure
))
1942 (assert (not failure
)))
1944 ;;; bug #389: "0.0 can't be converted to type NIL." (Brian Rowe
1946 (compile nil
'(lambda (x y a b c
)
1947 (- y
(* (signum x
) (sqrt (abs (- (* b x
) c
)))))))
1949 ;;; Type inference from CHECK-TYPE
1950 (let ((count0 0) (count1 0))
1951 (handler-bind ((sb-ext:compiler-note
(lambda (c) (incf count0
))))
1952 (compile nil
'(lambda (x)
1953 (declare (optimize (speed 3)))
1955 ;; forced-to-do GENERIC-+, etc, possible word -> bignum conversion note
1956 (assert (> count0
1))
1957 (handler-bind ((sb-ext:compiler-note
(lambda (c) (incf count1
))))
1958 (compile nil
'(lambda (x)
1959 (declare (optimize (speed 3)))
1960 (check-type x fixnum
)
1962 ;; Only the posssible word -> bignum conversion note
1963 (assert (= count1
1)))
1965 ;;; Up to 0.9.8.22 x86-64 had broken return value handling in the
1966 ;;; %SET-SAP-REF-DOUBLE/SINGLE VOPs.
1967 (with-test (:name
:sap-ref-float
)
1968 (compile nil
'(lambda (sap)
1969 (let ((x (setf (sb-vm::sap-ref-double sap
0) 1d0
)))
1971 (compile nil
'(lambda (sap)
1972 (let ((x (setf (sb-vm::sap-ref-single sap
0) 1d0
)))
1976 (with-test (:name
:string-union-types
)
1977 (compile nil
'(lambda (x)
1978 (declare (type (or (simple-array character
(6))
1979 (simple-array character
(5))) x
))
1982 ;;; MISC.623: missing functions for constant-folding
1988 (declare (optimize (space 2) (speed 0) (debug 2)
1989 (compilation-speed 3) (safety 0)))
1990 (loop for lv3 below
1
1992 (loop for lv2 below
2
1994 (bit #*1001101001001
1995 (min 12 (max 0 lv3
))))))))))))
1997 ;;; MISC.624: erroneous AVER in x86's %LOGBITP VOPs
2003 (declare (type (integer 21 28) a
))
2004 (declare (optimize (compilation-speed 1) (safety 2)
2005 (speed 0) (debug 0) (space 1)))
2006 (let* ((v7 (flet ((%f3
(f3-1 f3-2
)
2007 (loop for lv2 below
1
2011 (min 7 (max 0 (eval '0))))))))
2016 ;;; MISC.626: bandaged AVER was still wrong
2017 (assert (eql -
829253
2022 (declare (type (integer -
902970 2) a
))
2023 (declare (optimize (space 2) (debug 0) (compilation-speed 1)
2024 (speed 0) (safety 3)))
2025 (prog2 (if (logbitp 30 a
) 0 (block b3
0)) a
)))
2028 ;; MISC.628: constant-folding %LOGBITP was buggy
2034 (declare (optimize (safety 3) (space 3) (compilation-speed 3)
2035 (speed 0) (debug 1)))
2036 (not (not (logbitp 0 (floor 2147483651 (min -
23 0))))))))))
2038 ;; mistyping found by random-tester
2044 (declare (optimize (speed 1) (debug 0)
2045 (space 2) (safety 0) (compilation-speed 0)))
2047 (* (/ (multiple-value-prog1 -
29457482 -
5602513511) 1))))))))
2049 ;; aggressive constant folding (bug #400)
2051 (eq t
(funcall (compile nil
'(lambda () (or t
(the integer
(/ 1 0))))))))
2053 (with-test (:name
(:compiler
:constraint-propagation
:var-eql-to-non-var-1
))
2056 (compile nil
'(lambda (x y
)
2057 (when (eql x
(length y
))
2059 (declare (optimize (speed 3)))
2061 (compiler-note () (error "The code is not optimized.")))))
2063 (with-test (:name
(:compiler
:constraint-propagation
:var-eql-to-non-var-2
))
2066 (compile nil
'(lambda (x y
)
2067 (when (eql (length y
) x
)
2069 (declare (optimize (speed 3)))
2071 (compiler-note () (error "The code is not optimized.")))))
2073 (with-test (:name
(:compiler
:constraint-propagation
:float-bounds-1
))
2075 (compile nil
'(lambda (x)
2076 (declare (type (single-float * (3.0
)) x
))
2080 (compiler-note () (error "Deleted reachable code."))))
2082 (with-test (:name
(:compiler
:constraint-propagation
:float-bounds-2
))
2085 (compile nil
'(lambda (x)
2086 (declare (type single-float x
))
2089 (error "This is unreachable.")))))
2090 (compiler-note () (throw :note nil
)))
2091 (error "Unreachable code undetected.")))
2093 (with-test (:name
(:compiler
:constraint-propagation
:var-eql-to-var-1
))
2096 (compile nil
'(lambda (x y
)
2097 (when (typep y
'fixnum
)
2099 (unless (typep x
'fixnum
)
2100 (error "This is unreachable"))
2102 (compiler-note () (throw :note nil
)))
2103 (error "Unreachable code undetected.")))
2105 (with-test (:name
(:compiler
:constraint-propagation
:var-eql-to-var-2
))
2108 (compile nil
'(lambda (x y
)
2109 (when (typep y
'fixnum
)
2111 (unless (typep x
'fixnum
)
2112 (error "This is unreachable"))
2114 (compiler-note () (throw :note nil
)))
2115 (error "Unreachable code undetected.")))
2117 ;; Reported by John Wiseman, sbcl-devel
2118 ;; Subject: [Sbcl-devel] float type derivation bug?
2119 ;; Date: Tue, 4 Apr 2006 15:28:15 -0700
2120 (with-test (:name
(:type-derivation
:float-bounds
))
2121 (compile nil
'(lambda (bits)
2122 (let* ((s (if (= (ash bits -
31) 0) 1 -
1))
2123 (e (logand (ash bits -
23) #xff
))
2125 (ash (logand bits
#x7fffff
) 1)
2126 (logior (logand bits
#x7fffff
) #x800000
))))
2127 (float (* s m
(expt 2 (- e
150))))))))
2129 ;; Reported by James Knight
2130 ;; Subject: [Sbcl-devel] AVER: "(EQ (SB-NAME (SC-SB (TN-SC TN))) 'REGISTERS)"
2131 ;; Date: Fri, 24 Mar 2006 19:30:00 -0500
2132 (with-test (:name
:logbitp-vop
)
2134 '(lambda (days shift
)
2135 (declare (type fixnum shift days
))
2137 (canonicalized-shift (+ shift
1))
2138 (first-wrapping-day (- 1 canonicalized-shift
)))
2139 (declare (type fixnum result
))
2140 (dotimes (source-day 7)
2141 (declare (type (integer 0 6) source-day
))
2142 (when (logbitp source-day days
)
2146 (if (< source-day first-wrapping-day
)
2147 (+ source-day canonicalized-shift
)
2149 canonicalized-shift
) 7)))))))
2152 ;;; MISC.637: incorrect delaying of conversion of optional entries
2153 ;;; with hairy constant defaults
2154 (let ((f '(lambda ()
2155 (labels ((%f11
(f11-2 &key key1
)
2156 (labels ((%f8
(f8-2 &optional
(f8-5 (if nil
(return-from %f11
0) 0)))
2161 (assert (eq (funcall (compile nil f
)) :good
)))
2163 ;;; MISC.555: new reference to an already-optimized local function
2164 (let* ((l '(lambda (p1)
2165 (declare (optimize (speed 1) (safety 2) (debug 2) (space 0)) (type keyword p1
))
2167 (f (compile nil l
)))
2168 (assert (funcall f
:good
))
2169 (assert (nth-value 1 (ignore-errors (funcall f
42)))))
2171 ;;; Check that the compiler doesn't munge *RANDOM-STATE*.
2172 (let* ((state (make-random-state))
2173 (*random-state
* (make-random-state state
))
2174 (a (random most-positive-fixnum
)))
2175 (setf *random-state
* state
)
2176 (compile nil
`(lambda (x a
)
2177 (declare (single-float x
)
2178 (type (simple-array double-float
) a
))
2179 (+ (loop for i across a
2182 (assert (= a
(random most-positive-fixnum
))))
2184 ;;; MISC.641: LET-conversion after physical environment analysis lost NLX-INFOs
2185 (let ((form '(lambda ()
2186 (declare (optimize (speed 1) (space 0) (debug 2)
2187 (compilation-speed 0) (safety 1)))
2188 (flet ((%f3
(f3-1 &key
(key1 (count (floor 0 (min -
74 0)) #())))
2190 (apply #'%f3
0 nil
)))))
2191 (assert (zerop (funcall (compile nil form
)))))
2193 ;;; size mismatch: #<SB-VM::EA :DWORD base=#<SB-C:TN t1[RDX]> disp=1> is a :DWORD and #<SB-C:TN t2[RAX]> is a :QWORD. on x86-64
2194 (compile nil
'(lambda ()
2195 (let ((x (make-array '(1) :element-type
'(signed-byte 32))))
2196 (setf (aref x
0) 1))))
2198 ;;; step instrumentation confusing the compiler, reported by Faré
2199 (handler-bind ((warning #'error
))
2200 (compile nil
'(lambda ()
2201 (declare (optimize (debug 2))) ; not debug 3!
2202 (let ((val "foobar"))
2203 (map-into (make-array (list (length val
))
2204 :element-type
'(unsigned-byte 8))
2205 #'char-code val
)))))
2207 ;;; overconfident primitive type computation leading to bogus type
2209 (let* ((form1 '(lambda (x)
2210 (declare (type (and condition function
) x
))
2212 (fun1 (compile nil form1
))
2214 (declare (type (and standard-object function
) x
))
2216 (fun2 (compile nil form2
)))
2217 (assert (raises-error?
(funcall fun1
(make-condition 'error
))))
2218 (assert (raises-error?
(funcall fun1 fun1
)))
2219 (assert (raises-error?
(funcall fun2 fun2
)))
2220 (assert (eq (funcall fun2
#'print-object
) #'print-object
)))
2222 ;;; LET* + VALUES declaration: while the declaration is a non-standard
2223 ;;; and possibly a non-conforming extension, as long as we do support
2224 ;;; it, we might as well get it right.
2226 ;;; Bug reported by Kaersten Poeck on sbcl-devel 20061023.
2227 (compile nil
'(lambda () (let* () (declare (values list
)))))
2230 ;;; test for some problems with too large immediates in x86-64 modular
2232 (compile nil
'(lambda (x) (declare (fixnum x
))
2233 (logand most-positive-fixnum
(logxor x most-positive-fixnum
))))
2235 (compile nil
'(lambda (x) (declare (fixnum x
))
2236 (logand most-positive-fixnum
(+ x most-positive-fixnum
))))
2238 (compile nil
'(lambda (x) (declare (fixnum x
))
2239 (logand most-positive-fixnum
(* x most-positive-fixnum
))))
2242 (assert (let (warned-p)
2243 (handler-bind ((warning (lambda (w) (setf warned-p t
))))
2246 (list (let ((y (the real x
)))
2247 (unless (floatp y
) (error ""))
2249 (integer-length x
)))))
2252 ;; Dead / in safe code
2253 (with-test (:name
:safe-dead-
/)
2256 (funcall (compile nil
2258 (declare (optimize (safety 3)))
2263 (division-by-zero ()
2266 ;;; Dead unbound variable (bug 412)
2267 (with-test (:name
:dead-unbound
)
2270 (funcall (compile nil
2274 (unbound-variable ()
2277 ;;; No compiler notes from compiling SUBSEQ SIMPLE-VECTOR.
2278 (handler-bind ((sb-ext:compiler-note
'error
))
2281 (funcall (compile nil
`(lambda (s p e
)
2282 (declare (optimize speed
)
2289 ;;; No compiler notes from compiling COPY-SEQ SIMPLE-VECTOR.
2290 (handler-bind ((sb-ext:compiler-note
'error
))
2293 (funcall (compile nil
`(lambda (s)
2294 (declare (optimize speed
)
2297 (vector 1 2 3 4)))))
2299 ;;; bug in adding DATA-VECTOR-REF-WITH-OFFSET to x86-64
2300 (assert (not (mismatch #(1.0f0
2.0f0
) (make-array 2 :element-type
'single-float
:initial-contents
(list 1.0f0
2.0f0
)))))
2302 ;;; bug in interval-arithmetic used by the compiler: needless attempt to coerce too
2303 ;;; large bignums to floats
2304 (dolist (op '(* / + -
))
2308 (declare (type (integer 0 #.
(* 2 (truncate most-positive-double-float
))) x
))
2311 do
(let ((arg (random (truncate most-positive-double-float
))))
2312 (assert (eql (funcall fun arg
)
2313 (funcall op
0.0d0 arg
)))))))
2315 (with-test (:name
:high-debug-known-function-inlining
)
2316 (let ((fun (compile nil
2318 (declare (optimize (debug 3)) (inline append
))
2319 (let ((fun (lambda (body)
2324 '((foo (bar)))))))))
2327 (with-test (:name
:high-debug-known-function-transform-with-optional-arguments
)
2328 (compile nil
'(lambda (x y
)
2329 (declare (optimize sb-c
::preserve-single-use-debug-variables
))
2331 (some-unknown-function
2333 (return (member x y
))))
2338 ;;; Compiling W-P-O when the pinned objects are known to be fixnums
2340 (compile nil
'(lambda (x y
)
2341 (declare (fixnum y
) (character x
))
2342 (sb-sys:with-pinned-objects
(x y
)
2343 (some-random-function))))
2345 ;;; *CHECK-CONSISTENCY* and TRULY-THE
2347 (with-test (:name
:bug-423
)
2348 (let ((sb-c::*check-consistency
* t
))
2349 (handler-bind ((warning #'error
))
2350 (flet ((make-lambda (type)
2354 (let ((q (truly-the list z
)))
2357 (let ((q (truly-the vector z
)))
2361 (compile nil
(make-lambda 'list
))
2362 (compile nil
(make-lambda 'vector
))))))
2364 ;;; this caused a momentary regression when an ill-adviced fix to
2365 ;;; bug 427 made ANY-REG suitable for primitive-type T:
2367 ;;; no :MOVE-ARG VOP defined to move #<SB-C:TN t1> (SC SB-VM::SINGLE-REG) to #<SB-C:TN t2> (SC SB-VM::ANY-REG)
2368 ;;; [Condition of type SIMPLE-ERROR]
2375 (setf (sb-alien:deref
(sb-alien:cast
(sb-alien:sap-alien
(unknown1) (* unsigned-char
))
2376 (* double-float
))) frob
))
2378 (%zig
(the (values (single-float (0.0
) 1.0) &optional
) (unknown2)))
2382 ;;; non-required arguments in HANDLER-BIND
2383 (assert (eq :oops
(car (funcall (compile nil
2386 (handler-bind ((error (lambda (&rest args
) (return (cons :oops args
)))))
2390 ;;; NIL is a legal function name
2391 (assert (eq 'a
(flet ((nil () 'a
)) (nil))))
2394 (assert (null (let* ((x 296.3066f0
)
2396 (form `(lambda (r p2
)
2397 (declare (optimize speed
(safety 1))
2398 (type (simple-array single-float nil
) r
)
2399 (type (integer -
9369756340 22717335) p2
))
2400 (setf (aref r
) (* ,x
(the (eql 22717067) p2
)))
2402 (r (make-array nil
:element-type
'single-float
))
2404 (funcall (compile nil form
) r y
)
2405 (let ((actual (aref r
)))
2406 (unless (eql expected actual
)
2407 (list expected actual
))))))
2409 (assert (null (let* ((x -
2367.3296f0
)
2411 (form `(lambda (r p2
)
2412 (declare (optimize speed
(safety 1))
2413 (type (simple-array single-float nil
) r
)
2414 (type (eql 46790178) p2
))
2415 (setf (aref r
) (+ ,x
(the (integer 45893897) p2
)))
2417 (r (make-array nil
:element-type
'single-float
))
2419 (funcall (compile nil form
) r y
)
2420 (let ((actual (aref r
)))
2421 (unless (eql expected actual
)
2422 (list expected actual
))))))
2427 (compile nil
'(lambda (p1 p2
)
2429 (optimize (speed 1) (safety 0)
2430 (debug 0) (space 0))
2431 (type (member 8174.8604) p1
)
2432 (type (member -
95195347) p2
))
2434 8174.8604 -
95195347)))
2442 (declare (optimize (speed 3) (safety 0) (debug 3) (space 1))
2443 (type (member -
94430.086f0
) p1
))
2444 (floor (the single-float p1
) 19311235)))
2453 (declare (optimize (speed 1) (safety 2)
2454 (debug 2) (space 3))
2455 (type (eql -
39466.56f0
) p1
))
2456 (ffloor p1
305598613)))
2465 (declare (optimize (speed 1) (safety 1) (debug 1) (space 2))
2466 (type (eql -
83232.09f0
) p1
))
2467 (ceiling p1 -
83381228)))
2476 (declare (optimize (speed 1) (safety 1)
2477 (debug 1) (space 0))
2478 (type (member -
66414.414f0
) p1
))
2479 (ceiling p1 -
63019173f0
)))
2488 (declare (optimize (speed 0) (safety 1)
2489 (debug 0) (space 1))
2490 (type (eql 20851.398f0
) p1
))
2491 (fceiling p1
80839863)))
2497 (compile nil
'(lambda (x)
2498 (declare (type (eql -
5067.2056) x
))
2505 (compile nil
'(lambda (x) (declare (type (eql -
1.0) x
))
2511 (assert (plusp (funcall
2515 (declare (optimize (speed 0) (safety 1) (debug 1) (space 1))
2516 (type (eql -
39887.645) p1
))
2517 (mod p1
382352925)))
2521 (assert (let ((result (funcall
2525 (declare (optimize (speed 0) (safety 3) (debug 1) (space 0))
2526 (type (eql 33558541) p2
))
2529 (typep result
'single-float
)))
2533 (let* ((form '(lambda (p2)
2534 (declare (optimize (speed 0) (safety 1)
2535 (debug 2) (space 2))
2536 (type (member -
19261719) p2
))
2537 (ceiling -
46022.094 p2
))))
2538 (values (funcall (compile nil form
) -
19261719)))))
2541 (assert (let* ((x 26899.875)
2543 (declare (optimize (speed 3) (safety 1) (debug 3) (space 1))
2544 (type (member ,x
#:g5437 char-code
#:g5438
) p2
))
2546 (floatp (funcall (compile nil form
) x
))))
2554 (declare (optimize (speed 3) (safety 2) (debug 3) (space 0))
2556 (+ 81535869 (the (member 17549.955 #:g35917
) p2
))))
2558 (+ 81535869 17549.955)))
2562 (let ((form '(lambda (p2)
2563 (declare (optimize (speed 0) (safety 2) (debug 0) (space 2))
2564 (type (member integer eql
) p2
))
2566 (funcall (compile nil form
) 'integer
))))
2570 (let ((form '(lambda (p2)
2571 (declare (optimize (speed 0) (safety 2) (debug 0) (space 2))
2572 (type (member integer mod
) p2
))
2574 (funcall (compile nil form
) 'integer
))))
2578 (let ((form '(lambda (p2)
2579 (declare (optimize (speed 0) (safety 2) (debug 0) (space 2))
2580 (type (member integer values
) p2
))
2582 (funcall (compile nil form
) 'integer
))))
2584 (with-test (:name
:string-aref-type
)
2585 (assert (eq 'character
2586 (funcall (compile nil
2588 (sb-c::compiler-derived-type
(aref (the string s
) 0))))
2591 (with-test (:name
:base-string-aref-type
)
2592 (assert (eq #+sb-unicode
'base-char
2593 #-sb-unicode
'character
2594 (funcall (compile nil
2596 (sb-c::compiler-derived-type
(aref (the base-string s
) 0))))
2597 (coerce "foo" 'base-string
)))))
2599 (with-test (:name
:dolist-constant-type-derivation
)
2600 (assert (equal '(integer 1 3)
2601 (funcall (compile nil
2603 (dolist (y '(1 2 3))
2605 (return (sb-c::compiler-derived-type y
))))))
2608 (with-test (:name
:dolist-simple-list-type-derivation
)
2609 (assert (equal '(integer 1 3)
2610 (funcall (compile nil
2612 (dolist (y (list 1 2 3))
2614 (return (sb-c::compiler-derived-type y
))))))
2617 (with-test (:name
:dolist-dotted-constant-list-type-derivation
)
2619 (fun (handler-bind ((style-warning (lambda (c) (push c warned
))))
2622 (dolist (y '(1 2 3 .
4) :foo
)
2624 (return (sb-c::compiler-derived-type y
)))))))))
2625 (assert (equal '(integer 1 3) (funcall fun t
)))
2626 (assert (= 1 (length warned
)))
2627 (multiple-value-bind (res err
) (ignore-errors (funcall fun nil
))
2629 (assert (typep err
'type-error
)))))
2631 (with-test (:name
:constant-list-destructuring
)
2632 (handler-bind ((sb-ext:compiler-note
#'error
))
2638 (destructuring-bind (a (b c
) d
) '(1 (2 3) 4)
2645 (destructuring-bind (a (b c
) d
) '(1 "foo" 4)
2649 ;;; Functions with non-required arguments used to end up with
2650 ;;; (&OPTIONAL-DISPATCH ...) as their names.
2651 (with-test (:name
:hairy-function-name
)
2652 (assert (eq 'read-line
(nth-value 2 (function-lambda-expression #'read-line
))))
2653 (assert (equal "#<FUNCTION READ-LINE>" (princ-to-string #'read-line
))))
2655 ;;; PROGV + RESTRICT-COMPILER-POLICY
2656 (with-test (:name
:progv-and-restrict-compiler-policy
)
2657 (let ((sb-c::*policy-restrictions
* sb-c
::*policy-restrictions
*))
2658 (restrict-compiler-policy 'debug
3)
2659 (let ((fun (compile nil
'(lambda (x)
2661 (declare (special i
))
2663 (progv '(i) (list (+ i
1))
2666 (assert (equal '(1 2 1) (funcall fun
1))))))
2668 ;;; It used to be possible to confuse the compiler into
2669 ;;; IR2-converting such a call to CONS
2670 (with-test (:name
:late-bound-primitive
)
2671 (compile nil
`(lambda ()
2672 (funcall 'cons
1))))