GNU bug report logs -
#24908
Possible unboxing bug in master triggered by (format)
Previous Next
Full log
View this message in rfc822 format
From: Daniel Llorens <daniel.llorens <at> bluewin.ch>
* module/ice-9/format.scm (format:fn-round): Don't let i become
negative.
* test-suite/tests/format.test: Regression test for "~2f".
---
module/ice-9/format.scm | 15 ++++++++-------
test-suite/tests/format.test | 6 +++++-
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/module/ice-9/format.scm b/module/ice-9/format.scm
index 1ef4cb5ef..d3066a527 100644
--- a/module/ice-9/format.scm
+++ b/module/ice-9/format.scm
@@ -1510,11 +1510,12 @@
(set! format:fn-len (- format:fn-len n)))
(string-set! format:fn-str (- i n) (string-ref format:fn-str i))))
+ ;; carry i+1 to work around bug #24908
(define (format:fn-round digits) ; round format:fn-str
(set! digits (+ digits format:fn-dot))
- (do ((i digits (- i 1)) ; "099",2 -> "10"
+ (do ((i (+ digits 1) (- i 1)) ; "099",2 -> "10"
(c 5)) ; "023",2 -> "02"
- ((or (= c 0) (< i 0)) ; "999",2 -> "100"
+ ((or (= c 0) (<= i 0)) ; "999",2 -> "100"
(if (= c 1) ; "005",2 -> "01"
(begin ; carry overflow
(set! format:fn-len digits)
@@ -1522,12 +1523,12 @@
(string-set! format:fn-str 0 #\1)
(set! format:fn-dot (+ format:fn-dot 1)))
(set! format:fn-len digits)))
- (set! c (+ (- (char->integer (string-ref format:fn-str i))
+ (set! c (+ (- (char->integer (string-ref format:fn-str (- i 1)))
format:zero-ch) c))
- (string-set! format:fn-str i (integer->char
- (if (< c 10)
- (+ c format:zero-ch)
- (+ (- c 10) format:zero-ch))))
+ (string-set! format:fn-str (- i 1) (integer->char
+ (if (< c 10)
+ (+ c format:zero-ch)
+ (+ (- c 10) format:zero-ch))))
(set! c (if (< c 10) 0 1))))
(define (format:fn-out modifier add-leading-zero?)
diff --git a/test-suite/tests/format.test b/test-suite/tests/format.test
index cc31942cc..8aab7e96b 100644
--- a/test-suite/tests/format.test
+++ b/test-suite/tests/format.test
@@ -112,7 +112,11 @@
;; in guile prior to 1.6.9 and 1.8.1, leading zeros were incorrectly
;; stripped, moving the decimal point and giving "25.0" here
(pass-if "string 02.5"
- (string=? "2.5" (format #f "~f" "02.5"))))
+ (string=? "2.5" (format #f "~f" "02.5")))
+
+ ;; regression against bug #24908
+ (pass-if "2f"
+ (string=? "10." (format #f "~2f" 9.9))))
;;;
;;; ~h
--
2.11.0
This bug report was last modified 8 years and 159 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.