1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-24 07:20:37 +00:00

Grudgingly accept function values in the function position

* lisp/emacs-lisp/cconv.el (cconv-convert):
Warn about (F ...) where F is a non-symbol function value (bytecode
object etc), but let it pass for compatibility's sake (bug#68931).
* test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp--fun-value-as-head):
New test.
This commit is contained in:
Mattias Engdegård 2024-02-05 17:56:11 +01:00
parent 95c8bfb11e
commit 5e69376292
2 changed files with 24 additions and 4 deletions

View File

@ -621,12 +621,16 @@ places where they originally did not directly appear."
(cconv-convert exp env extend))
(`(,func . ,forms)
(if (symbolp func)
(if (or (symbolp func) (functionp func))
;; First element is function or whatever function-like forms are:
;; or, and, if, catch, progn, prog1, while, until
`(,func . ,(mapcar (lambda (form)
(cconv-convert form env extend))
forms))
(let ((args (mapcar (lambda (form) (cconv-convert form env extend))
forms)))
(unless (symbolp func)
(byte-compile-warn-x
form
"Use `funcall' instead of `%s' in the function position" func))
`(,func . ,args))
(byte-compile-warn-x form "Malformed function `%S'" func)
nil))

View File

@ -848,6 +848,22 @@ byte-compiled. Run with dynamic binding."
(should (equal (bytecomp-tests--eval-interpreted form)
(bytecomp-tests--eval-compiled form)))))))
(ert-deftest bytecomp--fun-value-as-head ()
;; Check that (FUN-VALUE ...) is a valid call, for compatibility (bug#68931).
;; (There is also a warning but this test does not check that.)
(dolist (lb '(nil t))
(ert-info ((prin1-to-string lb) :prefix "lexical-binding: ")
(let* ((lexical-binding lb)
(s-int '(lambda (x) (1+ x)))
(s-comp (byte-compile s-int))
(v-int (lambda (x) (1+ x)))
(v-comp (byte-compile v-int))
(comp (lambda (f) (funcall (byte-compile `(lambda () (,f 3)))))))
(should (equal (funcall comp s-int) 4))
(should (equal (funcall comp s-comp) 4))
(should (equal (funcall comp v-int) 4))
(should (equal (funcall comp v-comp) 4))))))
(defmacro bytecomp-tests--with-fresh-warnings (&rest body)
`(let ((macroexp--warned ; oh dear
(make-hash-table :test #'equal :weakness 'key)))