From: Gabor Melis Date: Fri, 7 Apr 2006 16:20:57 +0000 (+0000) Subject: 0.9.11.22 X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=9be4fffc49a9a3f4e25817dd436a380ac562c3ad;p=sbcl.git 0.9.11.22 * fixed type derivation of float boundaries from numbers outside the appropriate float range --- diff --git a/NEWS b/NEWS index d69b943..327899e 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ changes in sbcl-0.9.12 relative to sbcl-0.9.11: * fixed bug: Tests for the (VECTOR T) type gave the wrong answer when given a vector displaced to an adjustable array. (reported by Utz-Uwe Haus) + * bug fix: derivation of float boundaries from numbers outside the + appropriate float range (reported by John Wiseman) * improvements to DOCUMENTATION for TYPE and STRUCTURE doc-types: allow condition class objects as arguments to DOCUMENTATION and (SETF DOCUMENTATION); only find and set documentation for diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 8a3a055..a4672e5 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -267,24 +267,30 @@ ;;; defined range. Quite useful if we want to convert some type of ;;; bounded integer into a float. (macrolet - ((frob (fun type) + ((frob (fun type most-negative most-positive) (let ((aux-name (symbolicate fun "-DERIVE-TYPE-AUX"))) `(progn - (defun ,aux-name (num) - ;; When converting a number to a float, the limits are - ;; the same. - (let* ((lo (bound-func (lambda (x) - (coerce x ',type)) - (numeric-type-low num))) - (hi (bound-func (lambda (x) - (coerce x ',type)) - (numeric-type-high num)))) - (specifier-type `(,',type ,(or lo '*) ,(or hi '*))))) - - (defoptimizer (,fun derive-type) ((num)) - (one-arg-derive-type num #',aux-name #',fun)))))) - (frob %single-float single-float) - (frob %double-float double-float)) + (defun ,aux-name (num) + ;; When converting a number to a float, the limits are + ;; the same. + (let* ((lo (bound-func (lambda (x) + (if (< x ,most-negative) + ,most-negative + (coerce x ',type))) + (numeric-type-low num))) + (hi (bound-func (lambda (x) + (if (< ,most-positive x ) + ,most-positive + (coerce x ',type))) + (numeric-type-high num)))) + (specifier-type `(,',type ,(or lo '*) ,(or hi '*))))) + + (defoptimizer (,fun derive-type) ((num)) + (one-arg-derive-type num #',aux-name #',fun)))))) + (frob %single-float single-float + most-negative-single-float most-positive-single-float) + (frob %double-float double-float + most-negative-double-float most-positive-double-float)) ) ; PROGN ;;;; float contagion diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index d822e71..ac32148 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -2036,8 +2036,7 @@ ;; Reported by John Wiseman, sbcl-devel ;; Subject: [Sbcl-devel] float type derivation bug? ;; Date: Tue, 4 Apr 2006 15:28:15 -0700 -(with-test (:name (:type-derivation :float-bounds) - :fails-on :sbcl) +(with-test (:name (:type-derivation :float-bounds)) (compile nil '(lambda (bits) (let* ((s (if (= (ash bits -31) 0) 1 -1)) (e (logand (ash bits -23) #xff)) diff --git a/version.lisp-expr b/version.lisp-expr index e663ca2..f520e43 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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".) -"0.9.11.21" +"0.9.11.22"