From 478d6f95ff1349434dd7880a7e67d7e288e32972 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 20 Jun 2011 21:43:56 -0400 Subject: [PATCH] * lisp/emacs-lisp/bytecomp.el (add-to-list): Add handler to check the variable's status. --- lisp/ChangeLog | 5 +++++ lisp/emacs-lisp/bytecomp.el | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 76339320b83..f0039e0b613 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2011-06-21 Stefan Monnier + + * emacs-lisp/bytecomp.el (add-to-list): Add handler to check the + variable's status. + 2011-06-20 Jan Djärv * x-dnd.el (x-dnd-version-from-flags) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 1e7ee315942..127f93c6858 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -4244,6 +4244,25 @@ binding slots have been popped." (defun byte-compile-form-make-variable-buffer-local (form) (byte-compile-keep-pending form 'byte-compile-normal-call)) +(byte-defop-compiler-1 add-to-list byte-compile-add-to-list) +(defun byte-compile-add-to-list (form) + ;; FIXME: This could be used for `set' as well, except that it's got + ;; its own opcode, so the final `byte-compile-normal-call' needs to + ;; be replaced with something else. + (pcase form + (`(,fun ',var . ,_) + (byte-compile-check-variable var 'assign) + (if (assq var byte-compile--lexical-environment) + (byte-compile-log-warning + (format "%s cannot use lexical var `%s'" fun var) + nil :error) + (unless (or (not (byte-compile-warning-enabled-p 'free-vars)) + (boundp var) + (memq var byte-compile-bound-variables) + (memq var byte-compile-free-references)) + (byte-compile-warn "assignment to free variable `%S'" var) + (push var byte-compile-free-references))))) + (byte-compile-normal-call form)) ;;; tags -- 2.39.2