]> git.eshelyaron.com Git - emacs.git/commitdiff
macroexp.el: Fix missing warning for intermediate expansions
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 19 Jul 2023 15:29:32 +0000 (11:29 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Fri, 21 Jul 2023 15:48:42 +0000 (11:48 -0400)
When a macro expanded to a call to an obsolete macro, we failed
to emit a warning for that use of the obsolete macro.

* lisp/emacs-lisp/macroexp.el (macroexp-macroexpand):
Use `macroexpand-1` to check obsolecence of intermediate expansions.

* test/lisp/emacs-lisp/macroexp-tests.el
(macroexp--test-obsolete-macro): New test.

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

index 290bf1c933a11ecd957bd4ab5206042c6263f648..083a7f58f368246e23ef15d461f65136be6a93de 100644 (file)
@@ -227,21 +227,19 @@ It should normally be a symbol with position and it defaults to FORM."
 (defun macroexp-macroexpand (form env)
   "Like `macroexpand' but checking obsolescence."
   (let* ((macroexpand-all-environment env)
-         (new-form
-          (macroexpand form env)))
-    (if (and (not (eq form new-form))   ;It was a macro call.
-             (car-safe form)
-             (symbolp (car form))
-             (get (car form) 'byte-obsolete-info))
-        (let* ((fun (car form))
-               (obsolete (get fun 'byte-obsolete-info)))
-          (macroexp-warn-and-return
-           (macroexp--obsolete-warning
-            fun obsolete
-            (if (symbolp (symbol-function fun))
-                "alias" "macro"))
-           new-form (list 'obsolete fun) nil fun))
-      new-form)))
+         new-form)
+    (while (not (eq form (setq new-form (macroexpand-1 form env))))
+      (let ((fun (car-safe form)))
+        (setq form
+              (if (and fun (symbolp fun)
+                       (get fun 'byte-obsolete-info))
+                  (macroexp-warn-and-return
+                   (macroexp--obsolete-warning
+                    fun (get fun 'byte-obsolete-info)
+                    (if (symbolp (symbol-function fun)) "alias" "macro"))
+                   new-form (list 'obsolete fun) nil fun)
+                new-form))))
+    form))
 
 (defun macroexp--unfold-lambda (form &optional name)
   (or name (setq name "anonymous lambda"))
index 7bb38fe58f7072247e0275d263bf7395f6dc5952..d0efbfd28c1168de5e250841b4ba66e8a8ecbc6b 100644 (file)
                      (dyn dyn dyn dyn)
                      (dyn dyn dyn lex))))))
 
+(defmacro macroexp--test-macro1 ()
+  (declare (obsolete "new-replacement" nil))
+  1)
+
+(defmacro macroexp--test-macro2 ()
+  '(macroexp--test-macro1))
+
+(ert-deftest macroexp--test-obsolete-macro ()
+  (should
+   (let ((res
+          (cl-letf (((symbol-function 'message) #'user-error))
+            (condition-case err
+                (macroexpand-all '(macroexp--test-macro2))
+              (user-error (error-message-string err))))))
+     (should (and (stringp res) (string-match "new-replacement" res))))))
+
 ;;; macroexp-tests.el ends here