# HG changeset patch # User Mike Sperber # Date 1362243642 -3600 # Node ID b3a2bff825c840944f997050fb558cb2d8ed8a43 # Parent fffa151380192308e890528ce556f70a19da6e93 Make f?boundp less necessary. 2013-03-02 Michael Sperber * bytecomp.el (byte-compile-if): Port this patch from GNU Emacs: Author: Dave Love Date: Thu Dec 12 20:27:43 2002 +0000 (byte-compile-if): Suppress warnings from things protected by `(if (fboundp ...' or `(if (boundp ...'. diff -r fffa15138019 -r b3a2bff825c8 lisp/ChangeLog --- a/lisp/ChangeLog Fri Feb 22 16:18:37 2013 +0100 +++ b/lisp/ChangeLog Sat Mar 02 18:00:42 2013 +0100 @@ -1,3 +1,13 @@ +2013-03-02 Michael Sperber + + * bytecomp.el (byte-compile-if): Port this patch from GNU Emacs: + + Author: Dave Love + Date: Thu Dec 12 20:27:43 2002 +0000 + + (byte-compile-if): Suppress warnings from + things protected by `(if (fboundp ...' or `(if (boundp ...'. + 2013-02-20 Michael Sperber * files.el (file-remote-p): Remove an ancient piece of obsolete diff -r fffa15138019 -r b3a2bff825c8 lisp/bytecomp.el --- a/lisp/bytecomp.el Fri Feb 22 16:18:37 2013 +0100 +++ b/lisp/bytecomp.el Sat Mar 02 18:00:42 2013 +0100 @@ -4160,19 +4160,53 @@ (defun byte-compile-if (form) (byte-compile-form (car (cdr form))) - (if (null (nthcdr 3 form)) - ;; No else-forms - (let ((donetag (byte-compile-make-tag))) - (byte-compile-goto-if nil for-effect donetag) - (byte-compile-form (nth 2 form) for-effect) - (byte-compile-out-tag donetag)) - (let ((donetag (byte-compile-make-tag)) (elsetag (byte-compile-make-tag))) - (byte-compile-goto 'byte-goto-if-nil elsetag) - (byte-compile-form (nth 2 form) for-effect) - (byte-compile-goto 'byte-goto donetag) - (byte-compile-out-tag elsetag) - (byte-compile-body (cdr (cdr (cdr form))) for-effect) - (byte-compile-out-tag donetag))) + ;; Check whether we have `(if (fboundp ...' or `(if (boundp ...' + ;; and avoid warnings about the relevent symbols in the consequent. + (let* ((clause (nth 1 form)) + (fbound (if (eq 'fboundp (car-safe clause)) + (and (eq 'quote (car-safe (nth 1 clause))) + ;; Ignore if the symbol is already on the + ;; unresolved list. + (not (assq + (nth 1 (nth 1 clause)) ; the relevant symbol + byte-compile-unresolved-functions)) + (nth 1 (nth 1 clause))))) + (bound (if (eq 'boundp (car-safe clause)) + (and (eq 'quote (car-safe (nth 1 clause))) + (nth 1 (nth 1 clause))))) + (donetag (byte-compile-make-tag))) + (if (null (nthcdr 3 form)) + ;; No else-forms + (progn + (byte-compile-goto-if nil for-effect donetag) + ;; Maybe add to the bound list. + (let ((byte-compile-bound-variables + (if bound + (cons bound byte-compile-bound-variables) + byte-compile-bound-variables))) + (byte-compile-form (nth 2 form) for-effect)) + ;; Maybe remove the function symbol from the unresolved list. + (if fbound + (setq byte-compile-unresolved-functions + (delq (assq fbound byte-compile-unresolved-functions) + byte-compile-unresolved-functions))) + (byte-compile-out-tag donetag)) + (let ((elsetag (byte-compile-make-tag))) + (byte-compile-goto 'byte-goto-if-nil elsetag) + ;; As above for the first form. + (let ((byte-compile-bound-variables + (if bound + (cons bound byte-compile-bound-variables) + byte-compile-bound-variables))) + (byte-compile-form (nth 2 form) for-effect)) + (if fbound + (setq byte-compile-unresolved-functions + (delq (assq fbound byte-compile-unresolved-functions) + byte-compile-unresolved-functions))) + (byte-compile-goto 'byte-goto donetag) + (byte-compile-out-tag elsetag) + (byte-compile-body (cdr (cdr (cdr form))) for-effect) + (byte-compile-out-tag donetag)))) (setq for-effect nil)) (defun byte-compile-cond (clauses)