summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/byte-opt.el
diff options
context:
space:
mode:
authorMattias EngdegÄrd <mattiase@acm.org>2021-02-10 14:26:49 +0100
committerMattias EngdegÄrd <mattiase@acm.org>2021-02-10 14:47:40 +0100
commitf3ae26cb2ae581a84bbaa15a47e9917a799a5682 (patch)
tree40b17ab4e754eb4b8407edb42fa1bae11cf44681 /lisp/emacs-lisp/byte-opt.el
parentd9af4167019c4ed4f8605965cdf3e3ff7b72244f (diff)
downloademacs-f3ae26cb2ae581a84bbaa15a47e9917a799a5682.tar.gz
emacs-f3ae26cb2ae581a84bbaa15a47e9917a799a5682.tar.bz2
emacs-f3ae26cb2ae581a84bbaa15a47e9917a799a5682.zip
Fix local defvar scoping error (bug#46387)
This bug was introduced by the lexical variable constant propagation mechanism. It was discovered by Michael Heerdegen. * lisp/emacs-lisp/byte-opt.el (byte-optimize-let-form) (byte-optimize-body): Let the effects of a local defvar declaration be scoped by let and let*, not any arbitrary Lisp expression body (such as progn). * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--get-vars) (bytecomp-local-defvar): New test.
Diffstat (limited to 'lisp/emacs-lisp/byte-opt.el')
-rw-r--r--lisp/emacs-lisp/byte-opt.el4
1 files changed, 2 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 4fa2c75a889..8851f0ef32d 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -698,7 +698,8 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
(append new-lexvars byte-optimize--lexvars))
;; Walk the body expressions, which may mutate some of the records,
;; and generate new bindings that exclude unused variables.
- (let* ((opt-body (byte-optimize-body (cdr form) for-effect))
+ (let* ((byte-optimize--dynamic-vars byte-optimize--dynamic-vars)
+ (opt-body (byte-optimize-body (cdr form) for-effect))
(bindings nil))
(dolist (var let-vars)
;; VAR is (NAME EXPR [KEEP [VALUE]])
@@ -730,7 +731,6 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
;; all-for-effect is true. returns a new list of forms.
(let ((rest forms)
(result nil)
- (byte-optimize--dynamic-vars byte-optimize--dynamic-vars)
fe new)
(while rest
(setq fe (or all-for-effect (cdr rest)))