1.0.24.33: fix bug 316075
authorNikodemus Siivola <nikodemus@random-state.net>
Sun, 11 Jan 2009 16:34:00 +0000 (16:34 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sun, 11 Jan 2009 16:34:00 +0000 (16:34 +0000)
 https://bugs.launchpad.net/sbcl/+bug/316075

 * In DEFINE-ALIEN-ROUTINE, if the return-type is VOID, don't return
   the result of ALIEN-FUNCALL but a literal NIL instead.

NEWS
src/code/target-alieneval.lisp
tests/alien.impure.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index a9379b9..286d928 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,8 @@ changes in sbcl-1.0.25 relative to 1.0.24:
     by Tobias Rittweiler, patch by Paul Khuong)
   * bug fix: setting alien structure fields of type struct by value now
     computes the right offset for the memory copy.
+  * bug fix: compilation problem involving inlined calls to aliens with
+    result type VOID. (reported by Ken Olum)
 
 changes in sbcl-1.0.24 relative to 1.0.23:
   * new feature: ARRAY-STORAGE-VECTOR provides access to the underlying data
index fec2359..1478207 100644 (file)
@@ -723,25 +723,11 @@ allocated using ``malloc'', so it can be passed to foreign functions which use
             ((,lisp-name (function ,result-type ,@(arg-types))
                          :extern ,alien-name)
              ,@(alien-vars))
-             #-nil
-             (values (alien-funcall ,lisp-name ,@(alien-args))
-                     ,@(results))
-             #+nil
-             (if (alien-values-type-p result-type)
-                 ;; FIXME: RESULT-TYPE is a type specifier, so it
-                 ;; cannot be of type ALIEN-VALUES-TYPE. Also note,
-                 ;; that if RESULT-TYPE is VOID, then this code
-                 ;; disagrees with the computation of the return type
-                 ;; and with all usages of this macro. -- APD,
-                 ;; 2002-03-02
-                 (let ((temps (make-gensym-list
-                               (length
-                                (alien-values-type-values result-type)))))
-                   `(multiple-value-bind ,temps
-                        (alien-funcall ,lisp-name ,@(alien-args))
-                      (values ,@temps ,@(results))))
-                 (values (alien-funcall ,lisp-name ,@(alien-args))
-                         ,@(results)))))))))
+             ,@(if (eq 'void result-type)
+                   `((alien-funcall ,lisp-name ,@(alien-args))
+                     (values nil ,@(results)))
+                   `((values (alien-funcall ,lisp-name ,@(alien-args))
+                             ,@(results))))))))))
 \f
 (defun alien-typep (object type)
   #!+sb-doc
index 5029774..aa14cf2 100644 (file)
           (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))))))
+
 ;;; success
index 5c7d1bf..63330b3 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.24.32"
+"1.0.24.33"