From 46d0f1fef197f2049436a6fabca7f9e929b476a6 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 22 Nov 2025 06:52:55 -0500 Subject: [PATCH] (loaddefs-generate--make-autoload): Fix bug#79852 As JD Smith said we had 3 paths: 1. macro has `autoload-macro expand` and is already loaded: expand 2. macro has `autoload-macro expand` but is /not/ yet loaded: shortcut 3. macro does not have `autoload-macro expand`: shortcut and the co-existence of 1 and 2 is a problem because it means that same macro is sometimes handled one way and sometimes another, with different results. Remove number 2 by removing from the shortcut all the remaining macros that have `autoload-macro expand`. The immediate effect is that `make autoloads` now (auto)loads three more files: [...] loaddefs-gen: loading file frameset (for cl-defun) Loading frameset... INFO Scraping 1547 files for loaddefs...10% INFO Scraping 1547 files for loaddefs...20% loaddefs-gen: loading file semantic/analyze (for define-overloadable-function) Loading semantic/analyze... INFO Scraping 1547 files for loaddefs...30% INFO Scraping 1547 files for loaddefs...40% INFO Scraping 1547 files for loaddefs...50% INFO Scraping 1547 files for loaddefs...60% INFO Scraping 1547 files for loaddefs...70% loaddefs-gen: loading file tramp-adb (for tramp--with-startup) Loading tramp-adb... INFO Scraping 1547 files for loaddefs...80% loaddefs-gen: loading file grep (for define-compilation-mode) Loading grep... [...] * lisp/emacs-lisp/loaddefs-gen.el (loaddefs--defining-macros): Remove macros that are marked `autoload-macro expand`, even if they are not predefined. (loaddefs-generate--make-autoload): Simplify accordingly. --- lisp/emacs-lisp/loaddefs-gen.el | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index e24452ed8ed..9db2e425ea7 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -154,9 +154,7 @@ scanning for autoloads and will be in the `load-path'." ;; they request such expansion and produce suitable output (e.g. by ;; employing :autoload-end to omit unneeded forms). (defconst loaddefs--defining-macros - '( define-compilation-mode - cl-defun defun* cl-defmacro defmacro* define-overloadable-function - transient-define-prefix transient-define-suffix transient-define-infix + '( transient-define-prefix transient-define-suffix transient-define-infix transient-define-argument transient-define-group)) (defvar loaddefs--load-error-files nil) @@ -246,17 +244,12 @@ expand)' among their `declare' forms." ;; For known special macros which define functions, use `autoload' ;; directly. ((memq car loaddefs--defining-macros) - (let* ((macrop (memq car '(defmacro cl-defmacro defmacro*))) - (name (nth 1 form)) + (let* ((name (nth 1 form)) (args (pcase car - ((or 'defun* 'defmacro* 'cl-defun 'cl-defmacro - 'define-overloadable-function - 'transient-define-prefix 'transient-define-suffix + ((or 'transient-define-prefix 'transient-define-suffix 'transient-define-infix 'transient-define-argument 'transient-define-group) (nth 2 form)) - ('define-compilation-mode - nil) (_ t))) (body (nthcdr (or (function-get car 'doc-string-elt) 3) form)) (doc (if (stringp (car body)) (pop body)))) @@ -277,8 +270,7 @@ expand)' among their `declare' forms." ;; List of modes or just t. (or (if (nthcdr 2 (car body)) (list 'quote (nthcdr 2 (car body))) - t)))) - ,(if macrop ''macro nil))))) + t)))))))) ;; For defclass forms, use `eieio-defclass-autoload'. ((eq car 'defclass)