format: ~R should check a type only if base is not supplied.
authorStas Boukarev <stassats@gmail.com>
Fri, 11 Jan 2013 03:38:13 +0000 (07:38 +0400)
committerStas Boukarev <stassats@gmail.com>
Fri, 11 Jan 2013 03:38:13 +0000 (07:38 +0400)
(format t "~2r" 1/2) is valid.

src/code/late-format.lisp
src/code/target-format.lisp
tests/print.impure.lisp

index 9afc2a5..7777866 100644 (file)
       params
     (let ((n-arg (sb!xc:gensym "ARG")))
       `(let ((,n-arg ,(expand-next-arg)))
-         (unless (integerp ,n-arg)
+         (unless (or ,base
+                     (integerp ,n-arg))
            (error 'format-error
                   :complaint "~s is not of type INTEGER."
                   :args (list ,n-arg)
index 399feb0..f8ab91f 100644 (file)
        (commainterval 3))
       params
     (let ((arg (next-arg)))
-      (unless (integerp arg)
+      (unless (or base
+                  (integerp arg))
         (error 'format-error
                :complaint "~s is not of type INTEGER."
                :args (list arg)))
index 2e5b391..302fb6e 100644 (file)
       (error "Endless loop in FORMAT"))))
 
 (with-test (:name :format-type-check)
+  (assert (equal "1/10" (format nil "~2r" 1/2)))
   (assert (raises-error? (format nil "~r" 1.32) sb-format:format-error))
-  (assert (raises-error? (format nil "~c" 1.32) sb-format:format-error)))
+  (assert (raises-error? (format nil "~c" 1.32) sb-format:format-error))
+  (assert (equal "1/10" (eval '(format nil "~2r" 1/2))))
+  (assert (raises-error? (eval '(format nil "~r" 1.32)) sb-format:format-error))
+  (assert (raises-error? (eval '(format nil "~c" 1.32)) sb-format:format-error)))
 
 ;;; success