(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))
(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)
(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)."