X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Falien.impure.lisp;h=b327577dd8141aca25ce9dccfa7c2109928cf7d1;hb=9837343101c3da7b3a8f94609ec116ec5025436a;hp=50297747d3028c094a5e93a2a0f41f31bb02f23f;hpb=273757631306c5d5c36f3aa7fed496a6d5c5f35e;p=sbcl.git diff --git a/tests/alien.impure.lisp b/tests/alien.impure.lisp index 5029774..b327577 100644 --- a/tests/alien.impure.lisp +++ b/tests/alien.impure.lisp @@ -245,4 +245,53 @@ (with-alien ((myin int (slot myst 'myint))) (assert (integerp myin)))))) +;;; void conflicted with derived type +(declaim (inline bug-316075)) +(sb-alien:define-alien-routine bug-316075 void (result char :out)) +(with-test (:name bug-316075) + (handler-bind ((warning #'error)) + (compile nil '(lambda () (multiple-value-list (bug-316075)))))) + + +;;; Bug #316325: "return values of alien calls assumed truncated to +;;; correct width on x86" +#+x86-64 +(sb-alien::define-alien-callback truncation-test (unsigned 64) + ((foo (unsigned 64))) + foo) +#+x86 +(sb-alien::define-alien-callback truncation-test (unsigned 32) + ((foo (unsigned 32))) + foo) + +#+(or x86-64 x86) +(with-test (:name bug-316325) + ;; This test works by defining a callback function that provides an + ;; identity transform over a full-width machine word, then calling + ;; it as if it returned a narrower type and checking to see if any + ;; noise in the high bits of the result are properly ignored. + (macrolet ((verify (type input output) + `(with-alien ((fun (* (function ,type + #+x86-64 (unsigned 64) + #+x86 (unsigned 32))) + :local (alien-sap truncation-test))) + (let ((result (alien-funcall fun ,input))) + (assert (= result ,output)))))) + #+x86-64 + (progn + (verify (unsigned 64) #x8000000000000000 #x8000000000000000) + (verify (signed 64) #x8000000000000000 #x-8000000000000000) + (verify (signed 64) #x7fffffffffffffff #x7fffffffffffffff) + (verify (unsigned 32) #x0000000180000042 #x80000042) + (verify (signed 32) #x0000000180000042 #x-7fffffbe) + (verify (signed 32) #xffffffff7fffffff #x7fffffff)) + #+x86 + (progn + (verify (unsigned 32) #x80000042 #x80000042) + (verify (signed 32) #x80000042 #x-7fffffbe) + (verify (signed 32) #x7fffffff #x7fffffff)) + (verify (unsigned 16) #x00018042 #x8042) + (verify (signed 16) #x003f8042 #x-7fbe) + (verify (signed 16) #x003f7042 #x7042))) + ;;; success