From c5b1d0b954ad89792e3359303e2eb95b48bb72ae Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 5 Jun 2025 18:11:43 +0200 Subject: [PATCH] Fix function arity check for noncompiled callees (bug#78685) This is a regression from Emacs 29. * lisp/emacs-lisp/bytecomp.el (byte-compile-fdefinition): Make it work for functions that aren't compiled. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--f): (bytecomp-tests--warn-arity-noncompiled-callee): Add test. (cherry picked from commit 8b0f5b05976a99e82e54d6c602d47a8668ccd9d5) --- lisp/emacs-lisp/bytecomp.el | 7 ++----- test/lisp/emacs-lisp/bytecomp-tests.el | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index f89bf18094b..dce1b6f818b 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -1463,10 +1463,7 @@ when printing the error message." (let ((fn name)) (while (and (symbolp fn) (fboundp fn) - (or (symbolp (symbol-function fn)) - (consp (symbol-function fn)) - (and (not macro-p) - (compiled-function-p (symbol-function fn))))) + (functionp (symbol-function fn))) (setq fn (symbol-function fn))) (let ((advertised (get-advertised-calling-convention (if (and (symbolp fn) (fboundp fn)) @@ -1478,7 +1475,7 @@ when printing the error message." (if macro-p `(macro lambda ,advertised) `(lambda ,advertised))) - ((and (not macro-p) (compiled-function-p fn)) fn) + ((and (not macro-p) (functionp fn)) fn) ((not (consp fn)) nil) ((eq 'macro (car fn)) (cdr fn)) (macro-p nil) diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el b/test/lisp/emacs-lisp/bytecomp-tests.el index 8b0c1dad4c0..d1f272f7a4d 100644 --- a/test/lisp/emacs-lisp/bytecomp-tests.el +++ b/test/lisp/emacs-lisp/bytecomp-tests.el @@ -1357,6 +1357,20 @@ byte-compiled. Run with dynamic binding." (concat ";;; -*-lexical-binding:nil-*-\n" some-code))) (should (cookie-warning some-code)))))) +(defun bytecomp-tests--f (x y &optional u v) (list x y u v)) + +(ert-deftest bytecomp-tests--warn-arity-noncompiled-callee () + "Check that calls to non-compiled functions are arity-checked (bug#78685)" + (should (not (compiled-function-p (symbol-function 'bytecomp-tests--f)))) + (let* ((source (concat ";;; -*-lexical-binding:t-*-\n" + "(defun my-fun () (bytecomp-tests--f 11))\n")) + (lexical-binding t) + (log (bytecomp-tests--log-from-compilation source))) + (should (string-search + (concat "Warning: `bytecomp-tests--f' called with 1 argument," + " but requires 2-4") + log)))) + (ert-deftest bytecomp-tests--unescaped-char-literals () "Check that byte compiling warns about unescaped character literals (Bug#20852)." -- 2.39.5