emacs-devel
[Top][All Lists]
Advanced

[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)))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]