X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=tests%2Fcompiler.pure.lisp;h=f50322ee32cc462b6194f2494b03648d789554db;hb=0a705e49ea94017483b73f9c1e1670b119435bd2;hp=1a4fc7d23a2cf212a4e1d53e548594e71212f83e;hpb=66ee499237be5778b44b0d7b2de396562137228e;p=sbcl.git diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 1a4fc7d..f50322e 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -4383,3 +4383,31 @@ (compile nil `(lambda (x) (symbol-macrolet ((sv x)) (values (svref sv 0) (setf (svref sv 0) 99)))))) + +;; The compiler used to update the receiving LVAR's type too +;; aggressively when converting a large constant to a smaller +;; (potentially signed) one, causing other branches to be +;; inferred as dead. +(with-test (:name :modular-cut-constant-to-width) + (let ((test (compile nil + `(lambda (x) + (logand 254 + (case x + ((3) x) + ((2 2 0 -2 -1 2) 9223372036854775803) + (t 358458651))))))) + (assert (= (funcall test -10470605025) 26)))) + +(with-test (:name :append-type-derivation) + (let ((test-cases + '((lambda () (append 10)) (integer 10 10) + (lambda () (append nil 10)) (integer 10 10) + (lambda (x) (append x 10)) t + (lambda (x) (append x (cons 1 2))) cons + (lambda (x y) (append x (cons 1 2) y)) cons + (lambda (x y) (nconc x (the list y) x)) t + (lambda (x y) (print (length y)) (append x y)) sequence))) + (loop for (function result-type) on test-cases by #'cddr + do (assert (equal (car (cdaddr (sb-kernel:%simple-fun-type + (compile nil function)))) + result-type)))))