]> git.eshelyaron.com Git - emacs.git/commitdiff
Grudgingly accept function values in the function position
authorMattias EngdegÄrd <mattiase@acm.org>
Mon, 5 Feb 2024 16:56:11 +0000 (17:56 +0100)
committerEshel Yaron <me@eshelyaron.com>
Wed, 7 Feb 2024 10:54:03 +0000 (11:54 +0100)
* 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.

(cherry picked from commit 5e69376292994ffe69b7f8f52ae1ad85c60c2d29)

lisp/emacs-lisp/cconv.el
test/lisp/emacs-lisp/bytecomp-tests.el

index e210cfdf5ce07c3efc31082294f16e64cf9a98ff..4ff47971351d15e93ccb083a4edc1064c3d604a7 100644 (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))
 
index dcb72e4105a70cc32c22ab30eb9432c28c6f2ae1..8ccac492141e87d6c294a18f0bf69ee5fc8b03dd 100644 (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)))