Index: /trunk/source/level-0/l0-float.lisp
===================================================================
--- /trunk/source/level-0/l0-float.lisp	(revision 14364)
+++ /trunk/source/level-0/l0-float.lisp	(revision 14365)
@@ -819,4 +819,6 @@
 
 
+(defun positive-realpart-p (n)
+  (> (realpart n) 0))
 
 (defun expt (b e)
@@ -826,5 +828,5 @@
          (if (minusp e) (/ 1 (%integer-power b (- e))) (%integer-power b e)))
         ((zerop b)
-         (if (plusp (realpart e)) b (report-bad-arg e '(number (0) *))))
+         (if (plusp (realpart e)) b (report-bad-arg e '(satisfies positive-realpart-p))))
         ((and (realp b) (plusp b) (realp e))
          (if (or (typep b 'double-float)
Index: /trunk/source/level-1/l1-clos-boot.lisp
===================================================================
--- /trunk/source/level-1/l1-clos-boot.lisp	(revision 14364)
+++ /trunk/source/level-1/l1-clos-boot.lisp	(revision 14365)
@@ -3199,5 +3199,5 @@
            (setq old-wrapper (gf.instance.class-wrapper instance)))
          (unless old-wrapper
-           (report-bad-arg instance '(or standard-instance funcallable-standard-object))))
+           (report-bad-arg instance '(or standard-object funcallable-standard-object))))
        (when (eql 0 (%wrapper-instance-slots old-wrapper)) ; is it really obsolete?
          (let* ((class (%wrapper-class old-wrapper))
Index: /trunk/source/level-1/l1-streams.lisp
===================================================================
--- /trunk/source/level-1/l1-streams.lisp	(revision 14364)
+++ /trunk/source/level-1/l1-streams.lisp	(revision 14365)
@@ -6430,5 +6430,5 @@
               (setf (fill-pointer displaced) newpos)))
           newpos)
-        (report-bad-arg newpos `(integer 0 `(,(- (the fixnum (io-buffer-limit outbuf)) origin)))))
+        (report-bad-arg newpos `(integer 0 (,(- (the fixnum (io-buffer-limit outbuf)) origin)))))
       (the fixnum (- (the fixnum (io-buffer-idx outbuf)) origin)))))
 
@@ -6585,5 +6585,5 @@
           (setf (io-buffer-idx inbuf) (the fixnum (+ origin (the fixnum newpos))))
           newpos)
-        (report-bad-arg newpos `(integer 0 `(,(- (the fixnum (io-buffer-limit inbuf)) origin)))))
+        (report-bad-arg newpos `(integer 0 (,(- (the fixnum (io-buffer-limit inbuf)) origin)))))
       (the fixnum (- (the fixnum (io-buffer-idx inbuf)) origin)))))
 
Index: /trunk/source/lib/macros.lisp
===================================================================
--- /trunk/source/lib/macros.lisp	(revision 14364)
+++ /trunk/source/lib/macros.lisp	(revision 14365)
@@ -264,6 +264,9 @@
           ,@(if ret `((progn (setq ,varsym nil) ,ret))))))))
 
-(defmacro report-bad-arg (&rest args)
-  `(values (%badarg ,@args)))
+(defmacro report-bad-arg (&whole w thing typespec &environment env)
+  (when (quoted-form-p typespec)
+    (unless (ignore-errors (specifier-type-if-known (cadr typespec) env))
+      (warn "Unknown type specifier ~s in ~s." (cadr typespec) w)))
+  `(values (%badarg ,thing ,typespec)))
 
 (defmacro %cons-restart (name action report interactive test)
