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.
14 ;;;; This file of tests was added because the tests in 'compiler.pure.lisp'
15 ;;;; are a total hodgepodge- there is often no hugely compelling reason for
16 ;;;; their being tests of the compiler per se, such as whether
17 ;;;; INPUT-ERROR-IN-COMPILED-FILE is a subclass of SERIOUS-CONDITION;
18 ;;;; in addition to which it is near impossible to wade through the
19 ;;;; ton of nameless, slow, and noisy tests.
21 ;;;; This file strives to do better on all fronts:
22 ;;;; the tests should be fast, named, and not noisy.
24 (cl:in-package
:cl-user
)
26 (load "compiler-test-util.lisp")
28 (defun compiles-with-warning (lambda)
29 (assert (nth-value 2 (checked-compile lambda
:allow-warnings t
))))
31 (with-test (:name
(ldb :recognize-local-macros
))
32 ;; Should not call %LDB
33 (assert (not (ctu:find-named-callees
36 (declare (optimize speed
))
37 (macrolet ((b () '(byte 2 2)))
38 (ldb (b) (the fixnum x
)))))))))
40 (with-test (:name
(dpb :eval-order
:lp-1458190
))
41 (sb-int:collect
((calls))
43 (dpb (progn (calls 'eval-new
) new
)
44 (progn (calls 'eval-byte
) (byte 10 10))
45 (progn (calls 'eval-old
) old
))))
47 (assert (equal (calls)
48 '(eval-new eval-byte eval-old
))))))
50 ;; Best practice treats TRULY-THE as a special operator, not a macro,
51 ;; in a context such as (DPB X (TRULY-THE SB-KERNEL:BYTE-SPECIFIER ...) Y).
52 ;; DPB used to expand its second argument using MACROEXPAND and lose
53 ;; the nuance of TRULY-THE. Strictly speaking, byte-specifier is not a
54 ;; type specifier that users are supposed to know about, so portable code
55 ;; should not care, but this might affect internal code.
56 (with-test (:name
(dpb :inner-macro
))
57 (flet ((source-xform (sexpr)
58 (funcall (sb-int:info
:function
:source-transform
(car sexpr
))
59 sexpr
(sb-kernel:make-null-lexenv
))))
60 (assert (equal-mod-gensyms
62 '(dpb (new) (truly-the sb-kernel
:byte-specifier bspec
) (old)))
64 (byte (truly-the sb-kernel
:byte-specifier bspec
)))
65 (sb-kernel:%dpb new
(byte-size byte
) (byte-position byte
)
68 (with-test (:name
:inline-satisfies-predicate
)
69 ;; If we remove the indirections in these functions,
70 ;; this test should visibly break so that we can write a new test
71 ;; that asserts that inlining F works in (THE (SATISFIES F) obj).
72 (assert (equal (sb-ext:typexpand
'sb-impl
::function-name
)
73 '(satisfies sb-int
:legal-fun-name-p
)))
74 (let ((f (checked-compile '(lambda (x) (the sb-impl
::function-name x
)))))
75 (assert (equal (list (symbol-function 'sb-int
:valid-function-name-p
))
76 (ctu:find-named-callees f
))))
77 (let ((f (checked-compile '(lambda (x)
78 (declare (notinline sb-int
:legal-fun-name-p
))
79 (the sb-impl
::function-name x
)))))
80 (assert (equal (list (symbol-function 'sb-int
:legal-fun-name-p
))
81 (ctu:find-named-callees f
)))))
83 (with-test (:name
(make-array :untestable-type
:no-warning
))
84 (checked-compile `(lambda () (make-array '(2 2)
85 :element-type
`(satisfies foofa
)))))
87 (with-test (:name
(make-array nil
:no-warning
))
88 (checked-compile '(lambda () (make-array '(2 2) :element-type nil
))))
90 (with-test (:name
(nth-value :huge-n
:works
))
91 (flet ((return-a-ton-of-values ()
92 (values-list (loop for i below
5000 collect i
))))
93 (assert (= (nth-value 1 (return-a-ton-of-values)) 1))
94 (assert (= (nth-value 4000 (return-a-ton-of-values)) 4000))))
96 (defstruct (a-test-structure-foo
97 (:constructor make-a-foo-1
)
98 (:constructor make-a-foo-2
(b &optional a
)))
100 (b nil
:type integer
))
102 (with-test (:name
:improperly-initialized-slot-warns
)
103 ;; should warn because B's default is NIL, not an integer.
104 (compiles-with-warning '(lambda () (make-a-foo-1 :a
'what
)))
105 ;; should warn because A's default is 0
106 (compiles-with-warning '(lambda () (make-a-foo-2 3))))
108 (with-test (:name
(inline structure
:ctor
:no declaim
))
109 (let ((f (checked-compile '(lambda ()
110 (make-a-foo-1 :a
'wat
:b
3)))))
111 (assert (ctu:find-named-callees f
)))
112 (let ((f (checked-compile '(lambda ()
113 (declare (inline make-a-foo-1
))
114 (make-a-foo-1 :a
'wat
:b
3)))))
115 (assert (not (ctu:find-named-callees f
)))))
117 (with-test (:name
:internal-name-p
:skipped-on
:sb-xref-for-internals
)
118 (assert (sb-c::internal-name-p
'sb-int
:neq
)))
120 (with-test (:name
(:coerce-callable-to-fun
:note
))
121 (flet ((try (form what
)
122 (multiple-value-bind (fun failure-p warnings style-warnings notes
)
123 (checked-compile `(lambda (x)
124 (declare (optimize speed
))
126 (declare (ignore fun failure-p warnings style-warnings
))
127 (assert (search (format nil
"~A is not known to be" what
)
128 (princ-to-string (first notes
)))))))
130 (try '(eval `(work-with ,x
)) "callable expression")
132 ;; For this I'd accept either Z or X in the message.
133 (try '(progn (let ((z x
)) (identity z
))) "X")))
135 (with-test (:name
(princ-to-string :unflushable
))
136 ;; Ordinary we'll flush it
137 (let ((f (checked-compile '(lambda (x) (princ-to-string x
) x
))))
138 (assert (not (ctu:find-named-callees f
:name
'princ-to-string
))))
139 ;; But in high safety it should be called for effect
140 (let ((f (checked-compile '(lambda (x)
141 (declare (optimize safety
)) (princ-to-string x
) x
))))
142 (assert (ctu:find-named-callees f
:name
'princ-to-string
))))
144 (with-test (:name
:space-bounds-no-consing
145 :skipped-on
:interpreter
)
146 ;; Asking for the size of a heap space should not cost anything!
147 (ctu:assert-no-consing
(sb-vm::%space-bounds
:static
))
148 (ctu:assert-no-consing
(sb-vm::space-bytes
:static
)))
150 (with-test (:name
(sb-vm::map-allocated-objects
:no-consing
)
151 :skipped-on
:interpreter
)
153 (sb-int:dx-flet
((f (obj type size
)
154 (declare (ignore obj type size
))
156 (ctu:assert-no-consing
157 (sb-vm::map-allocated-objects
#'f
:dynamic
)
160 (with-test (:name
:pack-varints-as-bignum
)
161 (dotimes (i 500) ; do some random testing this many times
162 (let* ((random-numbers (loop repeat
(+ (random 20) 3)
163 collect
(1+ (random 4000))))
164 (test-list (sort (delete-duplicates random-numbers
) #'<))
165 (packed-int (sb-c::pack-code-fixup-locs test-list
))
166 (result (make-array 1 :element-type
'sb-ext
:word
)))
167 ;; The packer intrinsically self-checks the packing
168 ;; so we don't need to assert anything about that.
169 (sb-sys:with-pinned-objects
(packed-int result
)
170 ;; Now exercise the C unpacker.
171 ;; This hack of allocating 4 longs is terrible, but whatever.
172 (let ((unpacker (make-alien long
4))
174 (alien-funcall (extern-alien "varint_unpacker_init"
175 (function void
(* long
) unsigned
))
177 (sb-kernel:get-lisp-obj-address packed-int
))
178 (sb-int:collect
((unpacked))
182 (extern-alien "varint_unpack"
183 (function int
(* long
) system-area-pointer
))
184 unpacker
(sb-sys:vector-sap result
))))
185 (let ((val (aref result
0)))
186 ;; status of 0 is EOF, val = 0 means a decoded value was 0,
187 ;; which can't happen, so it's effectively EOF.
188 (when (or (eql status
0) (eql val
0)) (return))
189 (let ((loc (+ prev-loc val
)))
191 (setq prev-loc loc
)))))
192 (assert (equal (unpacked) test-list
))))))))
194 (with-test (:name
(symbol-value symbol-global-value
:quoted-constant
))
195 (let ((f (checked-compile '(lambda () (symbol-value 'char-code-limit
)))))
196 (assert (not (ctu:find-code-constants f
:type
'symbol
))))
197 (let ((f (checked-compile '(lambda () (symbol-global-value 'char-code-limit
)))))
198 (assert (not (ctu:find-code-constants f
:type
'symbol
)))))
200 (with-test (:name
(:set symbol-value
:of defglobal
))
201 (let ((s 'sb-c
::*recognized-declarations
*))
202 (assert (eq (sb-int:info
:variable
:kind s
) :global
)) ; verify precondition
203 (let ((f (checked-compile `(lambda () (setf (symbol-value ',s
) nil
)))))
204 ;; Should not have a call to SET-SYMBOL-GLOBAL-VALUE>
205 (assert (not (ctu:find-code-constants f
:type
'sb-kernel
:fdefn
))))))
207 (with-test (:name
:layout-constants
208 :skipped-on
(not (and :x86-64
:immobile-space
)))
209 (let ((addr-of-pathname-layout
211 (sb-kernel:get-lisp-obj-address
(sb-kernel:find-layout
'pathname
))
214 ;; The constant should appear in two CMP instructions
215 (dolist (line (split-string
216 (with-output-to-string (s)
217 (let ((sb-disassem:*disassem-location-column-width
* 0))
218 (disassemble 'pathnamep
:stream s
)))
220 (when (and (search "CMP" line
) (search addr-of-pathname-layout line
))
222 (assert (= count
2))))
224 (with-test (:name
:set-symbol-value-imm
:skipped-on
(not :x86-64
))
226 (dolist (line (split-string
227 (with-output-to-string (s)
228 (let ((sb-disassem:*disassem-location-column-width
* 0))
229 (disassemble '(lambda () (setq *print-base
* 8)) :stream s
)))
231 (when (and #+sb-thread
(search "MOV QWORD PTR [R" line
)
232 #-sb-thread
(search "MOV QWORD PTR [" line
)
233 (search (format nil
", ~D" (ash 8 sb-vm
:n-fixnum-tag-bits
)) line
))
237 (with-test (:name
:linkage-table-bogosity
:skipped-on
(not :sb-dynamic-core
))
238 (let ((strings (map 'list
(lambda (x) (if (consp x
) (car x
) x
))
239 #+sb-dynamic-core sb-vm
::+required-foreign-symbols
+
240 #-sb-dynamic-core
'())))
241 (assert (= (length (remove-duplicates strings
:test
'string
=))
244 (with-test (:name
(:no style-warning
:for inline
:cl-fun
))
245 (checked-compile '(lambda (x)
246 (declare (optimize (speed 3)) (inline length
)
247 (muffle-conditions compiler-note
))
250 (with-test (:name
:deleted-return-use
)
251 (checked-compile-and-assert ()
255 (let ((a (catch 'x
)))
256 (flet ((%f
(a &optional b
)
261 (with-test (:name
:shift-right-transform-nil-type
)
262 (checked-compile-and-assert (:optimize nil
)
264 (declare (type (integer -
10 -
6) c
)
265 (optimize (debug 2)))
267 (flet ((f1 (a &optional
(b (shiftf b
0)) c d
)
268 (declare (ignore a b c d
))
280 (with-test (:name
:move-lvar-result-through-unused-cast
)
281 (checked-compile-and-assert (:optimize nil
)
283 (declare (optimize (debug 0)))
287 (apply #'f
(list 2 3))))
288 (declare (notinline f
))
293 (with-test (:name
(:type-conflict funcall
:external-lambda
))
294 (compiles-with-warning `(lambda ()
295 (let ((x (lambda (x) (declare (fixnum x
)) x
)))
298 (with-test (:name
(:type-conflict
:callable
:external-lambda
))
299 (compiles-with-warning `(lambda ()
300 (let ((x (lambda (x) (declare (fixnum x
)) x
)))
301 (find-if x
"abca")))))
303 (with-test (:name
(:type-conflict map
:result-type
))
304 (compiles-with-warning `(lambda (str)
305 (map 'string
(lambda (x) (declare (ignore x
)) nil
)
308 (with-test (:name
(:type-conflict
:by-name
))
309 (compiles-with-warning `(lambda (str)
310 (map 'string
'evenp str
))))
312 (with-test (:name
(:type-conflict
:callable
:reporting
))
313 (multiple-value-bind (fun failure-p warnings
)
314 (checked-compile '(lambda (x) (map-into (make-string 10) #'evenp x
))
315 :allow-warnings
'warning
)
316 (declare (ignore fun
))
318 (assert (= (length warnings
) 1))
319 (search "Derived type of EVENP is"
320 (princ-to-string (first warnings
)))))
322 (with-test (:name
(:type-conflict string
:union-type
))
323 (compiles-with-warning `(lambda (x)
324 (find-if #'evenp
(the string x
)))))
326 (with-test (:name
(:type-conflict map-into
:let
))
327 (compiles-with-warning `(lambda (z)
329 (map-into z
#'evenp x
)))))
331 (with-test (:name
(:type-conflict map-into
:result
))
332 (compiles-with-warning `(lambda (z)
333 (map-into (make-string 10) #'evenp z
))))
335 (with-test (:name
(:type-conflict complement
))
339 (find z
"l" :test
(complement #'=)))
340 :allow-style-warnings t
))))
342 (with-test (:name
:type-across-hairy-lambda-transforms
)
343 (assert (subtypep (sb-kernel:%simple-fun-type
344 (checked-compile `(lambda (x) (find 1 (the vector x
)))))
345 '(function * (values (or (integer 1 1) null
) &optional
)))))
347 (with-test (:name
:lea-type-derivation
)
348 (checked-compile-and-assert ()
350 (declare ((integer -
3755795408964870057 -
3391381516052960895)
352 (ldb (byte 22 10) (* b
9)))
353 ((-3391381516052980893) 2826685)))
355 (with-test (:name
(:unused
&optional
:and
&key
))
356 (checked-compile-and-assert (:allow-style-warnings t
)
357 `(lambda (&optional x
&key
)
362 (with-test (:name
(:unknown values
:coercion
))
363 (checked-compile-and-assert ()
365 (declare (notinline values typep
))
366 (the integer
(values a
2305843009213693946 a -
207)))
367 ((123) (values 123 2305843009213693946 123 -
207))))
369 (with-test (:name
:deleted-block-during-generate-type-checks
)
370 (checked-compile-and-assert (:allow-warnings t
)
372 (declare (notinline min ash conjugate oddp
>=))
373 (if (and (or t
(>= a
)) (oddp 0))
376 (labels ((f (a b c
&key
)
377 (declare (ignore a b c
))
386 (ignore-errors (throw 'c
1))))
390 (with-test (:name
:block-delete-twice
)
391 (checked-compile-and-assert ()
393 (declare (notinline >=))
395 (lambda (x &key
(key (if (>= 0 1)
396 (return (catch 'ct5
0)))))
397 (declare (ignore key
))
399 (() 123 :test
(lambda (values expected
)
400 (equal (multiple-value-list
401 (funcall (first values
) (first expected
)))
404 (with-test (:name
:dead-lvars-and-stack-analysis
)
405 (checked-compile-and-assert ()
410 (multiple-value-prog1 19
412 (return-from b5
333)))))))
415 (with-test (:name
:mv-call-more-values
)
416 (checked-compile-and-assert ()
418 (multiple-value-call (lambda (&optional x y
&rest args
)
419 (declare (ignore args
))
424 (with-test (:name
:unused-casts-at-ir2-convert
)
425 (checked-compile-and-assert ()
429 (labels ((%f
(x &key
)
432 (unwind-protect (%f
(%f
0)))))))
435 (with-test (:name
:cmov-constants-different-primitive-type
)
436 (checked-compile-and-assert ()
439 ((2030) 4611686018427387908)
444 ((2030) 4611686018427387908)))
446 (with-test (:name
:mv-bind-skipping-vars-on-reoptimize
)
447 (checked-compile-and-assert ()
450 (apply (lambda (&rest args
)
451 (declare (ignore args
)))
457 (with-test (:name
:transform-on-a-nil-arg
)
458 (checked-compile-and-assert ()
462 (multiple-value-prog1
463 (unwind-protect (return 32))
464 (catch 'tag
(return 33)))
469 (with-test (:name
:nesteted-dx-deleted-uses
)
470 (checked-compile-and-assert ()
473 (let* ((v1 (make-array nil
:initial-element
475 (return-from b2 a
)))))
476 (declare (dynamic-extent v1
))
480 (with-test (:name
:deleted-during-locall-analyze-fun-1
)
481 (checked-compile-and-assert (:allow-warnings t
)
486 (() (condition 'program-error
))))
488 (with-test (:name
:delete-return-without-flush-dest
)
491 (funcall (checked-compile
494 (multiple-value-prog1 *
500 (with-test (:name
:let-conversion-inside-deleted-lambda
.1)
501 (checked-compile-and-assert ()
513 (with-test (:name
:let-conversion-inside-deleted-lambda
.2)
514 (checked-compile-and-assert ()
518 (lambda () (return)))
527 (with-test (:name
:unconvert-tail-calls
)
528 (checked-compile-and-assert ()
531 (labels ((f (&optional
(a (return))
535 (declare (ignore a b c args
))
544 (with-test (:name
:deleting-exits-with-multiple-users
)
545 (checked-compile-and-assert ()
548 (multiple-value-prog1 b
549 (tagbody (return (multiple-value-prog1 3
550 (if a
(go z
)))) z
))))
554 (with-test (:name
:merge-tail-sets-deleted-functional
)
555 (checked-compile-and-assert ()
563 (let ((x (progn (lambda (&optional
(x a
)) x
)
565 (return-from b3 a
))))
566 (unwind-protect x
)))))))
569 (with-test (:name
:interval-div-zero
)
570 (checked-compile-and-assert (:optimize
:safe
)
572 (truncate (the (integer 0 0) x
)
573 (the (rational (1) (2)) y
)))
574 ((0 3/2) (values 0 0))))
576 (with-test (:name
:float-remainders-rounding-errors
)
577 (loop for fun in
'(ceiling truncate floor
578 fceiling ftruncate ffloor
581 (assert (member (second
582 (third (sb-kernel:%simple-fun-type
585 (nth-value 1 (,fun
(the double-float x
) 1/2)))))))
586 '(double-float real
)))))
588 (with-test (:name
:float-quotient-rounding-errors
)
589 (checked-compile-and-assert (:optimize
:safe
)
591 (floor -
114658225103614 84619.58))
592 (() (values -
1354984705 8473228.0)))
593 (checked-compile-and-assert (:optimize
:safe
)
595 (ceiling 114658225103614 84619.58))
596 (() (values 1354984705 -
8473228.0))))
598 (with-test (:name
:complex-float-contagion
)
599 (checked-compile-and-assert ()
601 (declare (type (or double-float integer
) p1
))
603 ((1d0) #c
(1d0 2d0
))))
605 (with-test (:name
:equal-transform-member-types
)
608 (checked-compile-and-assert ()
610 (declare (type (member ,s1
) p1
)
611 (type (member ,s2
#*10) p2
))
615 (with-test (:name
:equalp-transform-numeric-types
)
616 (checked-compile-and-assert ()
618 (declare (type (or fixnum list
) p1
)
619 (type double-float p2
))
623 (with-test (:name
:equalp-transform-zero-array
)
624 (checked-compile-and-assert ()
626 (declare (simple-string a
)
627 (simple-bit-vector b
))
631 (with-test (:name
:fill-transform-returning-array-data
)
632 (let ((vector (make-array 10 :fill-pointer
2)))
633 (checked-compile-and-assert ()
635 (declare (type (vector t
) v
))
639 (with-test (:name
:missing-error-context
)
642 (with-output-to-string (*error-output
*)
643 (compile nil
'(sb-int:named-lambda bob
() (otherfun) 3)))))
644 (assert (search "in: SB-INT:NAMED-LAMBDA BOB" string
)))))
646 ;; Unrepeatability is confusing:
647 ;; The first compiler invocation used to leave *last-format-string*
648 ;; with a toplevel value, so the second would not print enough context
649 ;; because the format control and args were the same.
652 (with-test (:name
:cast-deletion-notes
)
653 (checked-compile-and-assert
656 (setf m
(list 1 2 3))
659 ((nil) #(1 2 3) :test
#'equalp
)))
661 (with-test (:name
:cast-deletion-notes
.2)
662 (multiple-value-bind (fun fail warn style notes
)
665 (setf m
(list 1 2 3))
670 (declare (ignore fail warn style
))
671 (assert (equalp (funcall fun nil
)
673 (assert (= (length notes
) 1))
674 (assert (typep (car notes
) 'code-deletion-note
))))
676 (with-test (:name
:array-call-type-deriver
)
677 (checked-compile-and-assert
680 (funcall (the (function (t t
)) #'aref
)
683 (((vector 333)) 333)))
685 (with-test (:name
:function-designator-cast-removal
)
686 (let ((fun (checked-compile
688 (declare (list vectors x
))
689 (map 'list
#'svref vectors x
)))))
690 (assert (notany (lambda (c)
693 (eq (sb-c::fdefn-name c
) 'svref
))
696 (ctu:find-code-constants fun
)))
697 (assert (equal (funcall fun
'(#(44)) '(0)) '(44)))))
699 (with-test (:name
:zombie-casts
)
700 (checked-compile-and-assert
706 (multiple-value-call #'f
707 (values (the integer
(unwind-protect (f 10 20)))
711 (with-test (:name
:zombie-casts
.2)
712 (let ((sb-c::*max-optimize-iterations
* 1))
713 (checked-compile-and-assert
716 (declare (type fixnum a b
))
717 (elt '(167992664 119771479)
720 (if (typep b
'(integer -
52))
726 (with-test (:name
:find-dfo-on-deleted-lambda
)
728 (funcall (checked-compile
730 (declare (notinline <))
736 (return (catch 'c
))))))
740 (with-test (:name
:ir1-ir2-dead-code-consistency
)
741 (checked-compile-and-assert
745 count
(zerop (min x x x x x x x x x x
))))
748 (with-test (:name
:ir1-ir2-dead-code-consistency
)
749 (checked-compile-and-assert
753 count
(zerop (min x x x x x x x x x x
))))
756 (with-test (:name
(setf svref
:constant-modification
))
758 (= (length (nth-value 2
761 (setf (svref #(a b c
) 1) x
))
762 :allow-warnings
'sb-int
:constant-modified
)))
765 (with-test (:name
(debug :constant-modification
))
767 (= (length (nth-value 2
770 (declare (optimize (debug 2)))
773 :allow-warnings
'sb-int
:constant-modified
)))
776 (with-test (:name
(debug :unused-tn-long-arglist
))
777 (checked-compile-and-assert
780 (declare (sb-vm:word n
))
782 (nth-value 33 (funcall x .
#.
(loop for i to
35 collect i
))))
783 ((10 (lambda (&rest args
) (values-list args
))) 33)))
785 (with-test (:name
(debug :unused-tn-very-long-arglist
))
786 (checked-compile-and-assert
789 (declare (sb-vm:word n
))
791 (nth-value 33 (funcall x .
#.
(loop for i to
350 collect i
))))
792 ((10 (lambda (&rest args
) (values-list args
))) 33)))
794 (with-test (:name
(dynamic-extent :recursive-local-functions
))
797 (let ((s (labels ((%f
() (%f
)))
799 (declare (dynamic-extent s
))
802 (with-test (:name
(:ctypep
:hairy-types
))
805 (the (cons (satisfies error
)) '("a"))))
809 `(lambda () (the (array abc
) #()))
810 :allow-style-warnings t
))))
812 (with-test (:name
(catch :evaluate-tag-before-%catch
))
813 (checked-compile-and-assert
814 (:allow-style-warnings t
)
816 (catch (multiple-value-call #'+
817 (if z
1 (values 1 2)))
822 (with-test (:name
:fewer-cast-conversions
)
823 (multiple-value-bind (fun failed
)
826 (let* ((v (cons 0 (catch 'ct
(the integer nil
)))))
827 (declare (dynamic-extent v
))
832 (handler-bind ((error (lambda (c) c
(throw 'ct
33))))
833 (assert (= (funcall fun
) 33)))))
835 (with-test (:name
:constant-folding-with-callable-args
)
836 (checked-compile '(lambda () (count #'%f
'(a)))
837 :allow-style-warnings t
))
839 (with-test (:name
:flushable-with-callable-args
)
840 (let ((fun (checked-compile '(lambda (y) (let ((x (count y
'(1 2 3))))
841 (declare (ignore x
)))))))
842 (assert (not (ctu:find-named-callees fun
)))))
844 (with-test (:name
(remove :count
))
845 (checked-compile-and-assert
848 (remove x
"aaa" :count
2))
850 (checked-compile-and-assert
853 (remove-if (lambda (y) (eql y x
)) "aaa" :count
2))
856 (with-test (:name
(:constant-fold
:allow-other-keys
))
857 (checked-compile-and-assert
860 (reduce #'+ '(1 2 3) :allow-other-keys t
:bad x
))
863 (with-test (:name
(:constant-fold
:allow-other-keys
.2))
864 (checked-compile-and-assert
867 (reduce #'+ '(1 2 3) :allow-other-keys x
))
870 (with-test (:name
(:constant-fold
:repeat-keys
))
871 (checked-compile-and-assert
874 (member nil
'(1 2 3) :key
#'evenp
:key x
))
875 ((1) '(1 2 3) :test
#'equal
)))
879 (with-test (:name
:function-and-instance-primitive-type
)
880 (checked-compile-and-assert
883 (declare (function f
))
884 (the standard-object f
)
885 (funcall f
#'list t
))
886 ((#'documentation
) (documentation #'list t
))))
888 (with-test (:name
:mv-call-safety-0
)
889 (checked-compile-and-assert
892 (flet ((%f1
(x y
) (+ x y
)))
893 (apply #'%f1 a
(list 0))))
896 (with-test (:name
:cast-type-check-external
)
897 (checked-compile-and-assert
900 (declare (notinline +))
902 (loop for lv2 below
1
910 (with-test (:name
:flush-combination-non-fun-type
)
911 (checked-compile-and-assert
914 (rassoc-if-not #'values
'((1 . a
)) :allow-other-keys t
)
918 (with-test (:name
:symeval-nil
)
919 (checked-compile-and-assert
922 (sb-kernel:symeval nil
))
925 (with-test (:name
(:physenv-analyze
:deleted-lambda
))
926 (checked-compile-and-assert
932 (ignore-errors (format log
""))))
935 (with-test (:name
(:ensure-lvar-fun-form
:lvar-uses
))
936 (checked-compile-and-assert
938 `(lambda (op) (funcall (case op
(equal '=) (t '=)) 1 2))
942 (with-test (:name
:substitute-let-funargs-during-find-initial-dfo
)
950 (with-test (:name
:split-ir2-blocks-cmov
)
951 (checked-compile-and-assert
961 (with-test (:name
:=-rational-complex-rational-fold
)
962 (let ((fun (checked-compile '(lambda (x)
963 (declare ((complex integer
) x
))
965 (fun2 (checked-compile '(lambda (x)
966 (declare ((complex rational
) x
))
968 (assert (equal (sb-kernel:%simple-fun-type fun
)
969 '(function ((complex integer
)) (values null
&optional
))))
970 (assert (not (funcall fun
#C
(10 10))))
971 (assert (equal (sb-kernel:%simple-fun-type fun2
)
972 '(function ((complex rational
)) (values null
&optional
))))
973 (assert (not (funcall fun2
#C
(10 10))))))
975 (with-test (:name
:find-type-deriver
)
976 (checked-compile-and-assert
979 (find 1 x
:key
#'values
))
982 (with-test (:name
:tail-call-ltn-annotation
)
983 (checked-compile-and-assert
987 (multiple-value-call #'print
994 (with-test (:name
(:substitute-lvar-uses
:deleted-code-and-dx-lvars
))
1002 (unwind-protect 1))))
1003 (declare (dynamic-extent v
))
1005 :allow-warnings t
))))
1007 (with-test (:name
(restart-case :declaration-processing
))
1008 (checked-compile-and-assert
1011 (restart-case (list)
1012 (my-restart (x) "foo" "bar" x
)))
1014 (checked-compile-and-assert
1017 (restart-case (list)
1018 (my-restart () (declare))))
1021 (with-test (:name
(handler-case :declaration-processing
))
1022 (checked-compile-and-assert
1025 (handler-case (list 1 2) (error (e) "foo" "bar" e
)))
1027 (assert (nth-value 1
1030 (handler-case (declare)))
1031 :allow-failure t
))))