Index: /trunk/ccl/lib/macros.lisp
===================================================================
--- /trunk/ccl/lib/macros.lisp	(revision 908)
+++ /trunk/ccl/lib/macros.lisp	(revision 909)
@@ -786,38 +786,32 @@
   (let* ((construct (if e-c-p (if (eq e-c-p 'etypecase) e-c-p 'ctypecase) 'typecase))
          (types ())
-         (t-clause ())
-         (body ()))
+         (body ())
+         otherwise-seen-p)
     (flet ((bad-clause (c) 
              (error "Invalid clause ~S in ~S form." c construct)))
       (dolist (clause clauses)
         (if (atom clause)
-          (bad-clause clause)
-          (destructuring-bind (typespec &body consequents) clause
-            (when (eq construct 'typecase)
-              (if (eq typespec 'otherwise)
-                (setq typespec t))
-              (if (eq typespec t)
-                (if t-clause
-                  (bad-clause clause)   ; seen one already
-                  (setq t-clause `( t nil ,@consequents)))))
-            (unless (and (eq construct 'typecase)
-                         (eq typespec t))
-              (when
-                  (dolist (already types t)
-                    (when (subtypep typespec already)
-                      (warn "Clause ~S ignored in ~S form - shadowed by ~S ." clause construct (assq already clauses))
-                      (return)))
-                (push typespec types)
-                (unless (eq typespec t)
-                  (setq typespec `(typep ,key-var ',typespec)))
-                (push `(,typespec nil ,@consequents) body))))))
+            (bad-clause clause))
+        (if otherwise-seen-p
+            (error "OTHERWISE must be final clause in ~S form." construct))
+        (destructuring-bind (typespec &body consequents) clause
+          (when (eq construct 'typecase)
+            (if (eq typespec 'otherwise)
+                (progn (setq typespec t)
+                       (setq otherwise-seen-p t))))
+          (unless
+              (dolist (already types nil)
+                (when (subtypep typespec already)
+                  (warn "Clause ~S ignored in ~S form - shadowed by ~S ." clause construct (assq already clauses))
+                  (return t)))
+            (push typespec types)
+            (setq typespec `(typep ,key-var ',typespec))
+            (push `(,typespec nil ,@consequents) body))))
       (when e-c-p
         (setq types `(or ,@(nreverse types)))
         (if (eq construct 'etypecase)
-          (push `(t (values (%err-disp #.$XWRONGTYPE ,key-var ',types))) body)
-          (push `(t (setf ,keyform (ensure-value-of-type ,key-var ',types ',keyform))
-                  (go ,e-c-p)) body))))
-    (when t-clause
-      (push t-clause body))
+            (push `(t (values (%err-disp #.$XWRONGTYPE ,key-var ',types))) body)
+            (push `(t (setf ,keyform (ensure-value-of-type ,key-var ',types ',keyform))
+                      (go ,e-c-p)) body))))
     `(cond ,@(nreverse body))))
 
