emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master b41b4ad: Fix spurious "Lexical argument shadows the dynamic varia


From: Stefan Monnier
Subject: master b41b4ad: Fix spurious "Lexical argument shadows the dynamic variable" due to inlining
Date: Thu, 21 Jan 2021 13:15:11 -0500 (EST)

branch: master
commit b41b4add7bc2485fadc6ff3a890efbd1307b2351
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    Fix spurious "Lexical argument shadows the dynamic variable" due to inlining
    
    Before this patch doing:
    
        rm lisp/calendar/calendar.elc
        make lisp/calendar/cal-hebrew.elc
    
    would spew out lots of spurious such warnings about a `date` argument,
    pointing to code which has no `date` argument in sight.  This was
    because that code had calls to inlinable functions (taking a `date`
    argument) defined in `calendar.el`, and while `date` is a normal
    lexical var at the site of those functions' definitions, it was
    declared as dynbound at the call site.
    
    * lisp/emacs-lisp/byte-opt.el (byte-compile-inline-expand):
    Don't impose our local context onto the inlined function.
    
    * test/lisp/emacs-lisp/bytecomp-tests.el: Add matching test.
---
 lisp/emacs-lisp/byte-opt.el                             |  6 ++++--
 .../lisp/emacs-lisp/bytecomp-resources/foo-inlinable.el |  6 ++++++
 .../bytecomp-resources/nowarn-inline-after-defvar.el    | 17 +++++++++++++++++
 test/lisp/emacs-lisp/bytecomp-tests.el                  |  4 ++++
 4 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index cfa4070..66a117f 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -284,8 +284,10 @@
                           ;; If `fn' is from the same file, it has already
                           ;; been preprocessed!
                           `(function ,fn)
-                        (byte-compile-preprocess
-                         (byte-compile--reify-function fn)))))
+                        ;; Try and process it "in its original environment".
+                        (let ((byte-compile-bound-variables nil))
+                          (byte-compile-preprocess
+                           (byte-compile--reify-function fn))))))
            (if (eq (car-safe newfn) 'function)
                (byte-compile-unfold-lambda `(,(cadr newfn) ,@(cdr form)))
              ;; This can happen because of macroexp-warn-and-return &co.
diff --git a/test/lisp/emacs-lisp/bytecomp-resources/foo-inlinable.el 
b/test/lisp/emacs-lisp/bytecomp-resources/foo-inlinable.el
new file mode 100644
index 0000000..4748157
--- /dev/null
+++ b/test/lisp/emacs-lisp/bytecomp-resources/foo-inlinable.el
@@ -0,0 +1,6 @@
+;; -*- lexical-binding: t; -*-
+
+(defsubst foo-inlineable (foo-var)
+  (+ foo-var 2))
+
+(provide 'foo-inlinable)
diff --git 
a/test/lisp/emacs-lisp/bytecomp-resources/nowarn-inline-after-defvar.el 
b/test/lisp/emacs-lisp/bytecomp-resources/nowarn-inline-after-defvar.el
new file mode 100644
index 0000000..5582b2a
--- /dev/null
+++ b/test/lisp/emacs-lisp/bytecomp-resources/nowarn-inline-after-defvar.el
@@ -0,0 +1,17 @@
+;; -*- lexical-binding: t; -*-
+
+;; In this test, we try and make sure that inlined functions's code isn't
+;; mistakenly re-interpreted in the caller's context: we import an
+;; inlinable function from another file where `foo-var' is a normal
+;; lexical variable, and then call(inline) it in a function where
+;; `foo-var' is a dynamically-scoped variable.
+
+(require 'foo-inlinable
+         (expand-file-name "foo-inlinable.el"
+                           (file-name-directory
+                            (or byte-compile-current-file load-file-name))))
+
+(defvar foo-var)
+
+(defun foo-fun ()
+  (+ (foo-inlineable 5) 1))
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index 263736a..980b402 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -713,6 +713,10 @@ Subtests signal errors if something goes wrong."
  "warn-wide-docstring-multiline.el"
  "defvar.*foo.*wider than.*characters")
 
+(bytecomp--define-warning-file-test
+ "nowarn-inline-after-defvar.el"
+ "Lexical argument shadows" 'reverse)
+
 
 ;;;; Macro expansion.
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]