]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix byte-compilation of defalias with a constant macro cons pair
authorZach Shaftel <zach@shaf.tel>
Sun, 15 Jun 2025 00:57:21 +0000 (20:57 -0400)
committerEshel Yaron <me@eshelyaron.com>
Sun, 22 Jun 2025 08:09:37 +0000 (10:09 +0200)
* lisp/emacs-lisp/bytecomp.el (byte-compile-file-form-defalias):
Quote the function name in '(macro . function-name), since we eval
it later.
* test/lisp/emacs-lisp/bytecomp-tests.el
(test-eager-load-macro-expand-defalias): New test.
(Bug#78792)

(cherry picked from commit 075ebed98fea274b363d4d015b32edb0a12a9a89)

lisp/emacs-lisp/bytecomp.el
test/lisp/emacs-lisp/bytecomp-tests.el

index 452765c4c380b33bb3b8b5c2ed24786505c602de..d4e317301b6b8bdad9dab7aff286273c14acd09b 100644 (file)
@@ -5189,7 +5189,8 @@ binding slots have been popped."
        (pcase-let*
            ;; `macro' is non-nil if it defines a macro.
            ;; `fun' is the function part of `arg' (defaults to `arg').
-           (((or (and (or `(cons 'macro ,fun) `'(macro . ,fun)) (let macro t))
+           (((or (and (or `(cons 'macro ,fun) `'(macro . ,(app (list 'quote) fun)))
+                      (let macro t))
                  (and (let fun arg) (let macro nil)))
              arg)
             ;; `lam' is the lambda expression in `fun' (or nil if not
index d1f272f7a4dd5dcda82b3dbf9709eed28b2809dc..7382928da15acd046dcf57e1d06fb09164022cbb 100644 (file)
@@ -1322,6 +1322,24 @@ byte-compiled.  Run with dynamic binding."
       (defun def () (m))))
   (should (equal (funcall 'def) 4)))
 
+(ert-deftest test-eager-load-macro-expand-defalias ()
+  (ert-with-temp-file elfile
+    :suffix ".el"
+    (write-region
+     (concat ";;; -*- lexical-binding: t -*-\n"
+             (mapconcat #'prin1-to-string
+                        '((defalias 'nothing '(macro . ignore))
+                          (defalias 'something (cons 'macro #'identity))
+                          (defalias 'five (cons 'macro (lambda (&rest _) 5)))
+                          (eval-when-compile
+                            (defun def () (or (nothing t) (something (five nil))))))
+                        "\n"))
+     nil elfile)
+    (let* ((byte-compile-debug t)
+           (byte-compile-dest-file-function #'ignore))
+      (byte-compile-file elfile)
+      (should (equal (funcall 'def) 5)))))
+
 (defmacro bytecomp-tests--with-temp-file (file-name-var &rest body)
   (declare (indent 1))
   (cl-check-type file-name-var symbol)