Fix bug 186 by adding a declaration to the FILL transform.
... and write a test
... analogous fix in the transform for HAIRY-DATA-VECTOR-SET,
though any bug coming from there hadn't been
detected yet.
Greetings from Paris!
however, compiling and loading the same expression in a file works
as expected.
-186: "Undercautious FILL transform"
- Compiling and loading the following code:
- (declare (optimize (safety 3) (speed 2) (space 1)))
- (defun foo (x)
- (fill (make-string 10) x))
- and then running
- * (foo 4097)
- "@@@@@@@@@@"
- This is probably due to insufficient checking in the IR1
- deftransform for FILL
-
187: "type inference confusion around DEFTRANSFORM time"
(reported even more verbosely on sbcl-devel 2002-06-28 as "strange
bug in DEFTRANSFORM")
(let ((element-type-specifier (type-specifier element-ctype)))
`(multiple-value-bind (array index)
(%data-vector-and-index array index)
- (declare (type (simple-array ,element-type-specifier 1) array))
+ (declare (type (simple-array ,element-type-specifier 1) array)
+ (type ,element-type-specifier new-value))
(data-vector-set array
index
new-value)))))
:policy (> speed space))
"open code"
(let ((element-type (upgraded-element-type-specifier-or-give-up seq)))
- `(with-array-data ((data seq)
- (start start)
- (end end))
+ (values
+ `(with-array-data ((data seq)
+ (start start)
+ (end end))
(declare (type (simple-array ,element-type 1) data))
+ (declare (type fixnum start end))
(do ((i start (1+ i)))
((= i end) seq)
(declare (type index i))
;; WITH-ARRAY-DATA did our range checks once and for all, so
- ;; it'd be wasteful to check again on every AREF.
+ ;; it'd be wasteful to check again on every AREF...
(declare (optimize (safety 0)))
- (setf (aref data i) item)))))
+ (setf (aref data i) item)))
+ ;; ... though we still need to check that the new element can fit
+ ;; into the vector in safe code. -- CSR, 2002-07-05
+ `((declare (type ,element-type item))))))
\f
;;;; utilities
;; fixed in sbcl-0.7.4.22 by WHN
(assert (null (ignore-errors (subseq avec 1 5)))))
+;;; FILL
+(defun test-fill-typecheck (x)
+ (declare (optimize (safety 3) (space 2) (speed 1)))
+ (fill (make-string 10) x))
+
+(assert (string= (test-fill-typecheck #\@) "@@@@@@@@@@"))
+;;; BUG 186, fixed in sbcl-0.7.5.5
+(assert (null (ignore-errors (test-fill-typecheck 4097))))
+
;;; success
(quit :unix-status 104)
;;; for internal versions, especially for internal versions off the
;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.7.5.4"
+"0.7.5.5"