1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

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.
This commit is contained in:
Mattias Engdegård 2025-06-05 18:11:43 +02:00
parent 7393d7419e
commit 8b0f5b0597
2 changed files with 16 additions and 5 deletions

View file

@ -1456,10 +1456,7 @@ when printing the error message."
(let ((fn name)) (let ((fn name))
(while (and (symbolp fn) (while (and (symbolp fn)
(fboundp fn) (fboundp fn)
(or (symbolp (symbol-function fn)) (functionp (symbol-function fn)))
(consp (symbol-function fn))
(and (not macro-p)
(compiled-function-p (symbol-function fn)))))
(setq fn (symbol-function fn))) (setq fn (symbol-function fn)))
(let ((advertised (get-advertised-calling-convention (let ((advertised (get-advertised-calling-convention
(if (and (symbolp fn) (fboundp fn)) (if (and (symbolp fn) (fboundp fn))
@ -1471,7 +1468,7 @@ when printing the error message."
(if macro-p (if macro-p
`(macro lambda ,advertised) `(macro lambda ,advertised)
`(lambda ,advertised))) `(lambda ,advertised)))
((and (not macro-p) (compiled-function-p fn)) fn) ((and (not macro-p) (functionp fn)) fn)
((not (consp fn)) nil) ((not (consp fn)) nil)
((eq 'macro (car fn)) (cdr fn)) ((eq 'macro (car fn)) (cdr fn))
(macro-p nil) (macro-p nil)

View file

@ -1357,6 +1357,20 @@ byte-compiled. Run with dynamic binding."
(concat ";;; -*-lexical-binding:nil-*-\n" some-code))) (concat ";;; -*-lexical-binding:nil-*-\n" some-code)))
(should (cookie-warning 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 () (ert-deftest bytecomp-tests--unescaped-char-literals ()
"Check that byte compiling warns about unescaped character "Check that byte compiling warns about unescaped character
literals (Bug#20852)." literals (Bug#20852)."