unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Chong Yidong <cyd@stupidchicken.com>
Cc: Reiner Steib <Reiner.Steib@gmx.de>, emacs-devel@gnu.org
Subject: Re: Bogus byte-compiler warnings
Date: Thu, 16 Nov 2006 12:31:17 -0500	[thread overview]
Message-ID: <87zmar47tm.fsf@cyd.mit.edu> (raw)
In-Reply-To: <E1GjYMi-0007lz-JO@fencepost.gnu.org> (Richard Stallman's message of "Mon\, 13 Nov 2006 04\:44\:32 -0500")

Richard Stallman <rms@gnu.org> 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)))

  parent reply	other threads:[~2006-11-16 17:31 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-12 13:27 Bogus byte-compiler warnings Reiner Steib
2006-11-13  9:44 ` Richard Stallman
2006-11-13 11:27   ` Reiner Steib
2006-11-16 17:31   ` Chong Yidong [this message]
2006-11-16 18:51     ` Davis Herring
2006-11-19  7:59     ` Richard Stallman
2006-11-19 15:18       ` Chong Yidong
2007-12-01 11:29         ` Reiner Steib
2007-12-01 16:47           ` Dan Nicolaescu
2007-12-01 17:33             ` Reiner Steib
     [not found] <E1GjIng-0005ML-HG@monty-python.gnu.org>
2006-11-12 21:47 ` Jonathan Yavner
2006-11-13  0:57   ` Drew Adams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zmar47tm.fsf@cyd.mit.edu \
    --to=cyd@stupidchicken.com \
    --cc=Reiner.Steib@gmx.de \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).