emacs-diffs
[Top][All Lists]
Advanced

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

master 5e693762929: Grudgingly accept function values in the function po


From: Mattias Engdegård
Subject: master 5e693762929: Grudgingly accept function values in the function position
Date: Mon, 5 Feb 2024 12:05:13 -0500 (EST)

branch: master
commit 5e69376292994ffe69b7f8f52ae1ad85c60c2d29
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    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.
---
 lisp/emacs-lisp/cconv.el               | 12 ++++++++----
 test/lisp/emacs-lisp/bytecomp-tests.el | 16 ++++++++++++++++
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el
index e210cfdf5ce..4ff47971351 100644
--- a/lisp/emacs-lisp/cconv.el
+++ b/lisp/emacs-lisp/cconv.el
@@ -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))
 
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index dcb72e4105a..8ccac492141 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -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)))



reply via email to

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