[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Bogus byte-compiler warnings
From: |
Chong Yidong |
Subject: |
Re: Bogus byte-compiler warnings |
Date: |
Thu, 16 Nov 2006 12:31:17 -0500 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.90 (gnu/linux) |
Richard Stallman <address@hidden> writes:
> > (defun foo-func-1 ()
> > (when (and (boundp 'foo-var)
> > (fboundp 'foo-1))
> > (foo-1)))
>
> foo-1 will not be called if it's not fbound. (Emacs complains about
> both, foo-1 and foo-2).
>
> The reason there is a warning for foo-1 is that the code in the
> compiler to avoid such warnings recognizes only the simpler case (such
> as foo-2) and not the more complex case that foo-1 is.
>
> I would not mind if that code were made smarter.
How bout this patch?
*** emacs/lisp/emacs-lisp/bytecomp.el.~2.186.~ 2006-07-07 13:45:48.000000000
-0400
--- emacs/lisp/emacs-lisp/bytecomp.el 2006-11-16 12:27:07.000000000 -0500
***************
*** 3398,3432 ****
If CONDITION's value is (not (featurep 'emacs)) or (featurep 'xemacs),
that suppresses all warnings during execution of BODY."
(declare (indent 1) (debug t))
! `(let* ((fbound
! (if (eq 'fboundp (car-safe ,condition))
! (and (eq 'quote (car-safe (nth 1 ,condition)))
! ;; Ignore if the symbol is already on the
! ;; unresolved list.
! (not (assq (nth 1 (nth 1 ,condition)) ; the relevant symbol
! byte-compile-unresolved-functions))
! (nth 1 (nth 1 ,condition)))))
! (bound (if (or (eq 'boundp (car-safe ,condition))
! (eq 'default-boundp (car-safe ,condition)))
! (and (eq 'quote (car-safe (nth 1 ,condition)))
! (nth 1 (nth 1 ,condition)))))
! ;; Maybe add to the bound list.
! (byte-compile-bound-variables
! (if bound
! (cons bound byte-compile-bound-variables)
! byte-compile-bound-variables))
! ;; Suppress all warnings, for code not used in Emacs.
! (byte-compile-warnings
(if (member ,condition '((featurep 'xemacs)
(not (featurep 'emacs))))
! nil byte-compile-warnings)))
(unwind-protect
(progn ,@body)
;; 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))))))
(defun byte-compile-if (form)
(byte-compile-form (car (cdr form)))
--- 3398,3438 ----
If CONDITION's value is (not (featurep 'emacs)) or (featurep 'xemacs),
that suppresses all warnings during execution of BODY."
(declare (indent 1) (debug t))
! `(let* ((byte-compile-warnings
! ;; Suppress all warnings, for code not used in Emacs.
(if (member ,condition '((featurep 'xemacs)
(not (featurep 'emacs))))
! nil byte-compile-warnings))
! (byte-compile-bound-variables byte-compile-bound-variables)
! binding fbound-list)
! (mapc (lambda (subcondition)
! (cond ((eq 'fboundp (car-safe subcondition))
! (setq binding (and (eq 'quote (car-safe (nth 1
subcondition)))
! ;; Ignore if the symbol is already on the
! ;; unresolved list.
! (not (assq (nth 1 (nth 1 subcondition))
!
byte-compile-unresolved-functions))
! (nth 1 (nth 1 subcondition))))
! (if binding (setq fbound-list (cons binding fbound-list))))
! ((or (eq 'boundp (car-safe subcondition))
! (eq 'default-boundp (car-safe subcondition)))
! (setq binding (and (eq 'quote (car-safe (nth 1
subcondition)))
! (nth 1 (nth 1 subcondition))))
! (if binding (setq byte-compile-bound-variables
! (cons binding
byte-compile-bound-variables))))))
! ;; Inspect each element in an `and' condition; otherwise,
! ;; inspect the condition itself.
! (if (eq 'and (car-safe ,condition))
! (cdr-safe ,condition)
! (list ,condition)))
(unwind-protect
(progn ,@body)
;; Maybe remove the function symbol from the unresolved list.
! (mapc (lambda (fun)
! (setq byte-compile-unresolved-functions
! (delq (assq fun byte-compile-unresolved-functions)
! byte-compile-unresolved-functions)))
! fbound-list))))
(defun byte-compile-if (form)
(byte-compile-form (car (cdr form)))