changeset 106292:63ea0805c417

(byte-compile-warning-types): New type `suspicious'. (byte-compile-warnings): Use byte-compile-warning-types. (byte-compile-save-excursion): Warn about use of set-buffer right after save-excursion.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 27 Nov 2009 22:03:04 +0000
parents df75422e3816
children 231b52ec7f71
files lisp/ChangeLog lisp/emacs-lisp/bytecomp.el
diffstat 2 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Nov 27 19:31:57 2009 +0000
+++ b/lisp/ChangeLog	Fri Nov 27 22:03:04 2009 +0000
@@ -1,5 +1,11 @@
 2009-11-27  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* emacs-lisp/bytecomp.el (byte-compile-warning-types): New type
+	`suspicious'.
+	(byte-compile-warnings): Use byte-compile-warning-types.
+	(byte-compile-save-excursion): Warn about use of set-buffer right
+	after save-excursion.
+
 	* progmodes/gud.el (gud-basic-call): Don't only save the buffer but
 	the excursion as well.
 
--- a/lisp/emacs-lisp/bytecomp.el	Fri Nov 27 19:31:57 2009 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Fri Nov 27 22:03:04 2009 +0000
@@ -263,7 +263,7 @@
 (defconst byte-compile-warning-types
   '(redefine callargs free-vars unresolved
 	     obsolete noruntime cl-functions interactive-only
-	     make-local mapcar constants)
+	     make-local mapcar constants suspicious)
   "The list of warning types used when `byte-compile-warnings' is t.")
 (defcustom byte-compile-warnings t
   "List of warnings that the byte-compiler should issue (t for all).
@@ -285,17 +285,15 @@
   make-local  calls to make-variable-buffer-local that may be incorrect.
   mapcar      mapcar called for effect.
   constants   let-binding of, or assignment to, constants/nonvariables.
+  suspicious  constructs that usually don't do what the coder wanted.
 
 If the list begins with `not', then the remaining elements specify warnings to
 suppress.  For example, (not mapcar) will suppress warnings about mapcar."
   :group 'bytecomp
   :type `(choice (const :tag "All" t)
 		 (set :menu-tag "Some"
-		      (const free-vars) (const unresolved)
-		      (const callargs) (const redefine)
-		      (const obsolete) (const noruntime)
-		      (const cl-functions) (const interactive-only)
-		      (const make-local) (const mapcar) (const constants))))
+                      ,@(mapcar (lambda (x) `(const ,x))
+                                byte-compile-warning-types))))
 ;;;###autoload(put 'byte-compile-warnings 'safe-local-variable 'byte-compile-warnings-safe-p)
 
 ;;;###autoload
@@ -3714,6 +3712,9 @@
 
 
 (defun byte-compile-save-excursion (form)
+  (if (and (eq 'set-buffer (car-safe (car-safe (cdr form))))
+           (byte-compile-warning-enabled-p 'suspicious))
+      (byte-compile-warn "`save-excursion' defeated by `set-buffer'."))
   (byte-compile-out 'byte-save-excursion 0)
   (byte-compile-body-do-effect (cdr form))
   (byte-compile-out 'byte-unbind 1))