Subject: master: macroexp--expand-all mismatches on (name (c-defun-name)).

From: Alan Mackenzie <[email-masked]>
Date: Sat, 5 Apr 2025 18:41:00 +0000

Hello, Emacs.

In my .emacs I have the following:

(eval-after-load "cc-mode"
  '(progn
     (if (not (fboundp 'c-display-defun-name))
         (defun c-display-defun-name (&optional arg)
           "Display the name of the current CC mode defun and the position in it.
With a prefix arg, push the name onto the kill ring too."
           (interactive "P")
           (save-restriction
             (widen)
             (c-save-buffer-state ((name (c-defun-name))   <============
                                   (limits (c-declaration-limits t))
                                   (point-bol (c-point 'bol)))
               (when name
                 (message "%s.  Line %s/%s." name
                          (1+ (count-lines (car limits) point-bol))
                          (count-lines (car limits) (cdr limits)))
                 (if arg (kill-new name))
                 (sit-for 3 t))))))
     (define-key c-mode-base-map "\C-cn" 'c-display-defun-name)
     (put 'c-display-defun-name 'isearch-scroll t)))

..  While attempting to start my Emacs, the current Emacs master errors
out with this form, giving the message: 

 stop  Warning (initialization): An error occurred while loading ‘/home/acm/.emacs’:

error: Eager macro-expansion failure: (wrong-type-argument symbolp (name (c-defun-name))).

########################################################################

The cause of the error is in macroexp--expand-all in the pcase subform
near the end:  (`(,func . ,_) ....).  This subform triggers on (name
(c-defun-name)) and calls (function-get '(name (c-defun-name))),
thinking that ,func is a symbol.

This bug became visible after this commit:

commit a4ec9ca12969018cdf15b8cc713b3ba054326f99
Author: Stefan Kangas <[email-masked]>
Date:   Tue Apr 1 21:25:33 2025 +0200

    function-put: signal error with non-symbol

..  Before that commit function-get returned nil for a non-symbol
argument.

#########################################################################

The following patch fixes the bug:

diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 64ec634620a..8fd596ef58c 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -489,7 +489,7 @@ macroexp--expand-all
                   (macroexp--unfold-lambda `(,fn ,eexp . ,eargs)))
                  (_ `(,fn ,eexp . ,eargs)))))
             (`(funcall . ,_) form)      ;bug#53227
-            (`(,func . ,_)
+            (`(,(and func (pred symbolp)) . ,_)
              (let ((handler (function-get func 'compiler-macro)))
                ;; Macro expand compiler macros.  This cannot be delayed to
                ;; byte-optimize-form because the output of the compiler-macro can

-- 
Alan Mackenzie (Nuremberg, Germany).