diff options
author | Stefan Monnier <[email protected]> | 2011-06-20 21:43:56 -0400 |
---|---|---|
committer | Stefan Monnier <[email protected]> | 2011-06-20 21:43:56 -0400 |
commit | 478d6f95ff1349434dd7880a7e67d7e288e32972 (patch) | |
tree | 5c134974fce75f2b1ed8917884e1d7d26b2f990c /lisp/emacs-lisp/bytecomp.el | |
parent | ca5307394f6861fc825434c268e0a44adf8a3252 (diff) |
* lisp/emacs-lisp/bytecomp.el (add-to-list): Add handler to check the
variable's status.
Diffstat (limited to 'lisp/emacs-lisp/bytecomp.el')
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 1e7ee31594..127f93c685 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 |