(env (cdr (assq name list))))
(or env
(let ((fn name))
- (while (and (symbolp fn)
- (fboundp fn)
- (or (symbolp (symbol-function fn))
- (consp (symbol-function fn))
+ (while
+ (and (symbolp fn)
+ (fboundp fn)
+ (let ((s (symbol-function fn)))
+ (and
+ (or (symbolp s)
+ (consp s)
(and (not macro-p)
- (compiled-function-p (symbol-function fn)))))
- (setq fn (symbol-function fn)))
+ (or (closurep s)
+ (compiled-function-p s))))
+ (progn
+ (setq fn s)
+ t)))))
(let ((advertised (get-advertised-calling-convention
(if (and (symbolp fn) (fboundp fn))
;; Could be a subr.
(if macro-p
`(macro lambda ,advertised)
`(lambda ,advertised)))
- ((and (not macro-p) (compiled-function-p fn)) fn)
+ ((and (not macro-p) (or (closurep fn) (compiled-function-p fn)))
+ fn)
((not (consp fn)) nil)
((eq 'macro (car fn)) (cdr fn))
(macro-p nil)
(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)."