Fix byte-compiler warning for failed uses of lexical vars

* lisp/emacs-lisp/bytecomp.el (byte-compile-form): Fix byte-compiler
warning for failed uses of lexical vars.  (Bug#44980)
* test/lisp/emacs-lisp/bytecomp-tests.el
(bytecomp--define-warning-file-test): Don't prefix tests with
'warn'.
(bytecomp/error-lexical-var-with-add-hook\.el)
(bytecomp/error-lexical-var-with-remove-hook\.el)
(bytecomp/error-lexical-var-with-run-hook-with-args-until-failure\.el)
(bytecomp/error-lexical-var-with-run-hook-with-args-until-success\.el)
(bytecomp/error-lexical-var-with-run-hook-with-args\.el)
(bytecomp/error-lexical-var-with-symbol-value\.el): New tests.
* test/lisp/emacs-lisp/bytecomp-resources/error-lexical-var-with-symbol-value.el:
* test/lisp/emacs-lisp/bytecomp-resources/error-lexical-var-with-run-hook-with-args.el:
* test/lisp/emacs-lisp/bytecomp-resources/error-lexical-var-with-run-hook-with-args-until-success.el:
* test/lisp/emacs-lisp/bytecomp-resources/error-lexical-var-with-run-hook-with-args-until-failure.el:
* test/lisp/emacs-lisp/bytecomp-resources/error-lexical-var-with-remove-hook.el:
* test/lisp/emacs-lisp/bytecomp-resources/error-lexical-var-with-add-hook.el:
New files.
This commit is contained in:
Stefan Kangas 2020-12-01 13:34:17 +01:00
parent 8a27b0cad7
commit ace6eba036
8 changed files with 45 additions and 4 deletions

View file

@ -3203,7 +3203,7 @@ for symbols generated by the byte compiler itself."
run-hook-with-args-until-failure)) run-hook-with-args-until-failure))
(pcase (cdr form) (pcase (cdr form)
(`(',var . ,_) (`(',var . ,_)
(when (assq var byte-compile-lexical-variables) (when (memq var byte-compile-lexical-variables)
(byte-compile-report-error (byte-compile-report-error
(format-message "%s cannot use lexical var `%s'" fn var)))))) (format-message "%s cannot use lexical var `%s'" fn var))))))
;; Warn about using obsolete hooks. ;; Warn about using obsolete hooks.

View file

@ -0,0 +1,4 @@
;;; -*- lexical-binding: t; -*-
(let ((foo nil))
(add-hook 'foo #'next-line)
foo)

View file

@ -0,0 +1,4 @@
;;; -*- lexical-binding: t; -*-
(let ((foo nil))
(remove-hook 'foo #'next-line)
foo)

View file

@ -0,0 +1,3 @@
;;; -*- lexical-binding: t; -*-
(let ((foo nil))
(run-hook-with-args-until-failure 'foo))

View file

@ -0,0 +1,3 @@
;;; -*- lexical-binding: t; -*-
(let ((foo nil))
(run-hook-with-args-until-success 'foo #'next-line))

View file

@ -0,0 +1,3 @@
;;; -*- lexical-binding: t; -*-
(let ((foo nil))
(run-hook-with-args 'foo))

View file

@ -0,0 +1,4 @@
;;; -*- lexical-binding: t; -*-
(let ((foo nil))
(add-hook 'foo #'next-line)
foo)

View file

@ -548,7 +548,7 @@ Subtests signal errors if something goes wrong."
(should (equal (funcall 'def) -1))) (should (equal (funcall 'def) -1)))
(defmacro bytecomp--define-warning-file-test (file re-warning &optional reverse) (defmacro bytecomp--define-warning-file-test (file re-warning &optional reverse)
`(ert-deftest ,(intern (format "bytecomp-warn/%s" file)) () `(ert-deftest ,(intern (format "bytecomp/%s" file)) ()
:expected-result ,(if reverse :failed :passed) :expected-result ,(if reverse :failed :passed)
(with-current-buffer (get-buffer-create "*Compile-Log*") (with-current-buffer (get-buffer-create "*Compile-Log*")
(let ((inhibit-read-only t)) (erase-buffer)) (let ((inhibit-read-only t)) (erase-buffer))
@ -556,9 +556,29 @@ Subtests signal errors if something goes wrong."
(ert-info ((buffer-string) :prefix "buffer: ") (ert-info ((buffer-string) :prefix "buffer: ")
(should (re-search-forward ,re-warning)))))) (should (re-search-forward ,re-warning))))))
(bytecomp--define-warning-file-test "warn-free-setq.el" "free.*foo") (bytecomp--define-warning-file-test "error-lexical-var-with-add-hook.el"
"add-hook.*lexical var")
(bytecomp--define-warning-file-test "warn-free-variable-reference.el" "free.*bar") (bytecomp--define-warning-file-test "error-lexical-var-with-remove-hook.el"
"remove-hook.*lexical var")
(bytecomp--define-warning-file-test "error-lexical-var-with-run-hook-with-args-until-failure.el"
"args-until-failure.*lexical var")
(bytecomp--define-warning-file-test "error-lexical-var-with-run-hook-with-args-until-success.el"
"args-until-success.*lexical var")
(bytecomp--define-warning-file-test "error-lexical-var-with-run-hook-with-args.el"
"args.*lexical var")
(bytecomp--define-warning-file-test "error-lexical-var-with-symbol-value.el"
"symbol-value.*lexical var")
(bytecomp--define-warning-file-test "warn-free-setq.el"
"free.*foo")
(bytecomp--define-warning-file-test "warn-free-variable-reference.el"
"free.*bar")
(bytecomp--define-warning-file-test "warn-obsolete-defun.el" (bytecomp--define-warning-file-test "warn-obsolete-defun.el"
"foo-obsolete.*obsolete function.*99.99") "foo-obsolete.*obsolete function.*99.99")