From: Martin A. <ma...@at...> - 2010-01-28 19:42:53
|
Hi, there seems to be a problem in the current CVS head version (1.0.34.14) that is probably related to the recent optimizations in truncate/round (in compiler/srctran.lisp). This issue turned up when I tried to recompile SLIME (error and abort in swank-fancy-inspector.lisp) with the head version. Below is a simplified test case: ;;; Test Case (defun f (zone) (multiple-value-bind (h m) (truncate (abs zone) 1.0) (round (* 60.0 m)))) #| The value (0.0d0) is not of type REAL. [Condition of type TYPE-ERROR] Backtrace: 0: (SB-KERNEL:%UNARY-ROUND (0.0d0))[:EXTERNAL] 1: ((LAMBDA (SB-C::N)) #<SB-KERNEL:NUMERIC-TYPE (DOUBLE-FLOAT (0.0d0) (60.0d0))>) 2: (SB-C::ONE-ARG-DERIVE-TYPE #<SB-C::LVAR 1 {241DBE01}> #<FUNCTION (LAMBDA #) {2352CADD}> #<FUNCTION SB-KERNEL:%UNARY-ROUND> T) 3: (SB-C::IR1-OPTIMIZE-COMBINATION #<SB-C::COMBINATION :FUN # :ARGS (#) {241DBCE9}>) |# Martin -- Martin Atzmüller ma...@at... |
From: Paul K. <pv...@pv...> - 2010-01-29 14:35:27
|
On 2010-01-28, at 2:42 PM, Martin Atzmueller wrote: > there seems to be a problem in the current CVS head version (1.0.34.14) > that is probably related to the recent optimizations in truncate/round > (in compiler/srctran.lisp). [...] > ;;; Test Case > (defun f (zone) > (multiple-value-bind (h m) (truncate (abs zone) 1.0) > (round (* 60.0 m)))) > > #| > The value (0.0d0) is not of type REAL. > [Condition of type TYPE-ERROR] > > Backtrace: > 0: (SB-KERNEL:%UNARY-ROUND (0.0d0))[:EXTERNAL] [...] Thanks for the report! A (hot) patch for the issue follows. The problem is simply that I forgot to handle exclusive interval bounds. Paul Khuong index 22186ad..72c2695 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -1815,6 +1815,10 @@ (let* ((interval (numeric-type->interval n)) (low (interval-low interval)) (high (interval-high interval))) + (when (consp low) + (setf low (car low))) + (when (consp high) + (setf high (car high))) (specifier-type `(integer ,(if low (round low) |
From: Christophe R. <cs...@ca...> - 2010-01-30 20:48:54
|
Paul Khuong <pv...@pv...> writes: > + (when (consp low) > + (setf low (car low))) > + (when (consp high) > + (setf high (car high))) For after the release: it looks like type-bound-number is the function to use for this. Cheers, Christophe |