,@(mapcar
(lambda (c)
(cons (cond (has-otherwise
- (error "Misplaced t or `otherwise' clause"))
- ((memq (car c) '(t otherwise))
- (setq has-otherwise t)
- t)
+ (macroexp-warn-and-return
+ "Preceding catch-all clause shadows this clause"
+ nil 'suspicious nil (car c)))
+ ((memq (car c) '(t otherwise)) (setq has-otherwise t))
((eq (car c) 'cl--ecase-error-flag)
`(error "cl-ecase failed: %s, %s"
,temp ',(reverse head-list)))
(memq (caar c) '(quote function)))
(macroexp-warn-and-return
(format-message
- (concat "Case %s will match `%s'. If "
- "that's intended, write %s "
- "instead. Otherwise, don't "
- "quote `%s'.")
- (car c) (caar c) (list (cadar c) (caar c))
+ (concat "This clause matches `%s' and `%s'. "
+ "If that's intended, write %s instead. "
+ "Otherwise, don't quote `%s'.")
+ (caar c) (cadar c) (list (cadar c) (caar c))
(cadar c))
- `(cl-member ,temp ',(car c)) 'suspicious))
+ `(cl-member ,temp ',(car c)) 'suspicious
+ nil (car c)))
((listp (car c))
- (setq head-list (append (car c) head-list))
- `(cl-member ,temp ',(car c)))
+ (if (cl-subsetp (car c) head-list)
+ (macroexp-warn-and-return
+ (concat "All keys covered by preceding cases, "
+ "this clause can never match")
+ nil 'suspicious nil (car c))
+ (setq head-list (append (car c) head-list))
+ `(cl-member ,temp ',(car c))))
(t
(if (memq (car c) head-list)
- (error "Duplicate key in case: %s"
- (car c)))
- (push (car c) head-list)
- `(eql ,temp ,(if (keywordp (car c)) (car c) `',(car c)))))
+ (macroexp-warn-and-return
+ (format-message
+ "Duplicate key in case: %s" (car c))
+ nil 'suspicious nil (car c))
+ (push (car c) head-list)
+ `(eql ,temp ,(if (keywordp (car c)) (car c) `',(car c))))))
(or (cdr c) '(nil))))
clauses)))))