]> git.eshelyaron.com Git - emacs.git/commitdiff
macroexp-parse-body: correct parsing of empty body (bug#66136)
authorMattias Engdegård <mattiase@acm.org>
Mon, 25 Sep 2023 12:40:11 +0000 (14:40 +0200)
committerMattias Engdegård <mattiase@acm.org>
Mon, 25 Sep 2023 13:04:17 +0000 (15:04 +0200)
* lisp/emacs-lisp/macroexp.el (macroexp-parse-body):
Return an empty body even when there are declarations present.
Previously, the last declaration was considered part of the body,
which is only correct if the input consists of a single string.

Reported by Jens Schmidt.

lisp/emacs-lisp/macroexp.el

index f96e0d74026828dbe7b5764022a17f7fc71e8dd5..3ef924a5c736c75d54c7bd164c6de98934ccb115 100644 (file)
@@ -525,12 +525,17 @@ definitions to shadow the loaded ones for use in file byte-compilation."
 (defun macroexp-parse-body (body)
   "Parse a function BODY into (DECLARATIONS . EXPS)."
   (let ((decls ()))
-    (while (and (cdr body)
-                (let ((e (car body)))
-                  (or (stringp e)
-                      (memq (car-safe e)
-                            '(:documentation declare interactive cl-declare)))))
-      (push (pop body) decls))
+    ;; If there is only a string literal with nothing following, we
+    ;; consider this to be part of the body (the return value) rather
+    ;; than a declaration at this point.
+    (unless (and (null (cdr body)) (stringp (car body)))
+      (while
+          (and body
+               (let ((e (car body)))
+                 (or (stringp e)
+                     (memq (car-safe e)
+                           '(:documentation declare interactive cl-declare)))))
+        (push (pop body) decls)))
     (cons (nreverse decls) body)))
 
 (defun macroexp-progn (exps)