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:
parent
95c8bfb11e
commit
5e69376292
@ -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))
|
||||
|
||||
|
@ -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)))
|
||||
|
Loading…
Reference in New Issue
Block a user