]> git.eshelyaron.com Git - emacs.git/commitdiff
Preserve doc string in `byte-compile` (bug#55830)
authorMattias Engdegård <mattiase@acm.org>
Wed, 8 Jun 2022 08:03:55 +0000 (10:03 +0200)
committerMattias Engdegård <mattiase@acm.org>
Wed, 8 Jun 2022 08:08:05 +0000 (10:08 +0200)
* lisp/emacs-lisp/bytecomp.el (byte-compile--reify-function):
Don't transpose doc string and interactive spec, which must come
in this order.
* test/lisp/emacs-lisp/bytecomp-tests.el
(bytecomp-function-attributes): New test.

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

index 2e89504e8ff5b063bc12f697eda44aeb9a5c195c..ab21fba8a27817d24f3cca441fdbba39b811cd65 100644 (file)
@@ -2926,6 +2926,7 @@ FUN should be either a `lambda' value or a `closure' value."
       (push (pop body) preamble))
     (when (eq (car-safe (car body)) 'interactive)
       (push (pop body) preamble))
+    (setq preamble (nreverse preamble))
     ;; Turn the function's closed vars (if any) into local let bindings.
     (dolist (binding env)
       (cond
index 39f053136ae5777f8cc450f0bb5f20c6c2730862..27098d0bb1c0e1738bb24fc62bd8e91b8ce7e46f 100644 (file)
@@ -1553,6 +1553,27 @@ EXPECTED-POINT BINDINGS (MODES \\='\\='(ruby-mode js-mode python-mode)) \
   (should (byte-compile--suspicious-defcustom-choice
            '(choice (const :tag "foo" 'bar)))))
 
+(ert-deftest bytecomp-function-attributes ()
+  ;; Check that `byte-compile' keeps the declarations, interactive spec and
+  ;; doc string of the function (bug#55830).
+  (let ((fname 'bytecomp-test-fun))
+    (fset fname nil)
+    (put fname 'pure nil)
+    (put fname 'lisp-indent-function nil)
+    (eval `(defun ,fname (x)
+             "tata"
+             (declare (pure t) (indent 1))
+             (interactive "P")
+             (list 'toto x))
+          t)
+    (let ((bc (byte-compile fname)))
+      (should (byte-code-function-p bc))
+      (should (equal (funcall bc 'titi) '(toto titi)))
+      (should (equal (aref bc 5) "P"))
+      (should (equal (get fname 'pure) t))
+      (should (equal (get fname 'lisp-indent-function) 1))
+      (should (equal (aref bc 4) "tata\n\n(fn X)")))))
+
 ;; Local Variables:
 ;; no-byte-compile: t
 ;; End: