changeset 48822:162c286faa11

(byte-compile-if): Suppress warnings from things protected by `(if (fboundp ...' or `(if (boundp ...'.
author Dave Love <fx@gnu.org>
date Thu, 12 Dec 2002 20:27:43 +0000
parents d886606b4f3a
children 43cfe87c63fa
files lisp/emacs-lisp/bytecomp.el
diffstat 1 files changed, 48 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el	Thu Dec 12 20:27:09 2002 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Thu Dec 12 20:27:43 2002 +0000
@@ -10,7 +10,7 @@
 
 ;;; This version incorporates changes up to version 2.10 of the
 ;;; Zawinski-Furuseth compiler.
-(defconst byte-compile-version "$Revision: 2.118 $")
+(defconst byte-compile-version "$Revision: 2.119 $")
 
 ;; This file is part of GNU Emacs.
 
@@ -3225,19 +3225,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)