;;; In sbcl-0.6.10, Douglas Brebner reported that (SETF EXTERN-ALIEN)
;;; was messed up so badly that trying to execute expressions like
;;; this signalled an error.
-(setf (sb-alien:extern-alien "current_control_stack_pointer" sb-alien:unsigned)
- (sb-alien:extern-alien "current_control_stack_pointer" sb-alien:unsigned))
+(setf (sb-alien:extern-alien "thread_control_stack_size" sb-alien:unsigned)
+ (sb-alien:extern-alien "thread_control_stack_size" sb-alien:unsigned))
;;; bug 133, fixed in 0.7.0.5: Somewhere in 0.pre7.*, C void returns
;;; were broken ("unable to use values types here") when
(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)))
+
+(with-test (:name :bug-654485)
+ ;; DEBUG 2 used to prevent let-conversion of the open-coded ALIEN-FUNCALL body,
+ ;; which in turn led the dreaded %SAP-ALIEN note.
+ (handler-case
+ (compile nil
+ `(lambda (program argv)
+ (declare (optimize (debug 2)))
+ (with-alien ((sys-execv1 (function int c-string (* c-string)) :extern
+ "execv"))
+ (values (alien-funcall sys-execv1 program argv)))))
+ (compiler-note (n)
+ (error n))))
+
+(with-test (:name :bug-721087)
+ (assert (typep nil '(alien c-string)))
+ (assert (not (typep nil '(alien (c-string :not-null t)))))
+ (assert (eq :ok
+ (handler-case
+ (posix-getenv nil)
+ (type-error (e)
+ (when (and (null (type-error-datum e))
+ (equal (type-error-expected-type e)
+ '(alien (c-string :not-null t))))
+ :ok))))))
+
;;; success