(error ()
:ok)))))
+;;; Unused local alien caused a compiler error
+(with-test (:name unused-local-alien)
+ (let ((fun `(lambda ()
+ (sb-alien:with-alien ((alien1923 (array (sb-alien:unsigned 8) 72)))
+ (values)))))
+ (assert (not (funcall (compile nil fun))))))
+
+;;; Non-local exit from WITH-ALIEN caused alien stack to be leaked.
+(defvar *sap-int*)
+(defun try-to-leak-alien-stack (x)
+ (with-alien ((alien (array (sb-alien:unsigned 8) 72)))
+ (let ((sap-int (sb-sys:sap-int (alien-sap alien))))
+ (if *sap-int*
+ (assert (= *sap-int* sap-int))
+ (setf *sap-int* sap-int)))
+ (when x
+ (return-from try-to-leak-alien-stack 'going))
+ (never)))
+(with-test (:name :nlx-causes-alien-stack-leak)
+ (let ((*sap-int* nil))
+ (loop repeat 1024
+ do (try-to-leak-alien-stack t))))
+
+;;; bug 431
+(with-test (:name :alien-struct-redefinition)
+ (eval '(progn
+ (define-alien-type nil (struct mystruct (myshort short) (mychar char)))
+ (with-alien ((myst (struct mystruct)))
+ (with-alien ((mysh short (slot myst 'myshort)))
+ (assert (integerp mysh))))))
+ (let ((restarted 0))
+ (handler-bind ((error (lambda (e)
+ (let ((cont (find-restart 'continue e)))
+ (when cont
+ (incf restarted)
+ (invoke-restart cont))))))
+ (eval '(define-alien-type nil (struct mystruct (myint int) (mychar char)))))
+ (assert (= 1 restarted)))
+ (eval '(with-alien ((myst (struct mystruct)))
+ (with-alien ((myin int (slot myst 'myint)))
+ (assert (integerp myin))))))
+
;;; success