X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompiler.impure-cload.lisp;h=41d052513b935905990dc854308db9c105ac50c7;hb=2253ebaef8a0a1527d2282a1c10f48c62e0d4a83;hp=39c4d18d60a922041e9e79532f8d61242736ff77;hpb=b7d4d90a22c7dff0c41d261fc4f5c3266edd2a6e;p=sbcl.git diff --git a/tests/compiler.impure-cload.lisp b/tests/compiler.impure-cload.lisp index 39c4d18..41d0525 100644 --- a/tests/compiler.impure-cload.lisp +++ b/tests/compiler.impure-cload.lisp @@ -408,5 +408,39 @@ (assert (= (isieve 46349) 4792)) +;;; COERCE should not be constant-folded (reported by Nikodemus +;;; Siivola) +(let ((f (gensym))) + (setf (fdefinition f) (lambda (x) x)) + (let ((g (compile nil `(lambda () (coerce ',f 'function))))) + (setf (fdefinition f) (lambda (x) (1+ x))) + (assert (eq (funcall g) (fdefinition f))))) + +(let ((x (coerce '(1 11) 'vector))) + (incf (aref x 0)) + (assert (equalp x #(2 11)))) + +;;; and BIT-* too (reported by Paul F. Dietz) +(loop with v1 = #*0011 + and v2 = #*0101 + for f in '(bit-and bit-andc1 bit-andc2 bit-eqv + bit-ior bit-nand bit-nor bit-not + bit-orc1 bit-orc2 bit-xor + ) + for form = `(lambda () + (let ((v (,f ,v1 ,v2))) + (setf (aref v 0) (- 1 (aref v 0))) + (aref v 0))) + for compiled-res = (funcall (compile nil form)) + for real-res = (- 1 (aref (funcall f v1 v2) 0)) + do (assert (equal compiled-res real-res))) +(let* ((v #*0011) + (form `(lambda () + (let ((v (bit-not ,v))) + (setf (aref v 0) (- 1 (aref v 0))) + (aref v 0)))) + (compiled-res (funcall (compile nil form))) + (real-res (- 1 (aref (funcall (eval #'bit-not) v) 0)))) + (assert (equal compiled-res real-res))) (sb-ext:quit :unix-status 104)