[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#68938: Emacs "master". Incorrect code generated by pcase.
From: |
Alan Mackenzie |
Subject: |
bug#68938: Emacs "master". Incorrect code generated by pcase. |
Date: |
Mon, 5 Feb 2024 17:18:40 +0000 |
Hello Stefan and Emacs.
In a development version of Emacs, last synched with master in December,
I have added the following pcase clause to macroexp--expand-all in
lisp/emacs-lisp/macroexp.el:
(`(,(and 'defalias d
(guard (and (null defining-symbol)
(symbol-with-pos-p d))))
',sym . ,_)
;; Here, don't change the form; just set `defining-symbol'
;; for a (defalias 'foo ...) in the source code.
;; (when (symbol-with-pos-p d)
(setq defining-symbol sym)
form)
.. pcase expands that clause to this cond clause:
((eq x0 'defalias)
(cond
((let* ((d x0))
(and (null defining-symbol) (symbol-with-pos-p d)))
(let* ((x14 (cdr-safe form)))
(cond
((consp x14)
(let* ((x15 (car-safe x14)))
(cond
((consp x15)
(let* ((x16 (car-safe x15)))
(cond
((eq x16 'quote)
(let* ((x17 (cdr-safe x15)))
(cond
((consp x17)
(let* ((x18 (car-safe x17)) (x19 (cdr-safe x17)))
(cond
((null x19)
(let ((d x0) (sym x18))
(ignore d) (setq defining-symbol sym) form))
((consp x0)
(let* ((x21 (car-safe x0)))
(if (eq x21 'lambda) (funcall pcase-3 x0 x14)
(funcall pcase-2 x0))))
(t (funcall pcase-2 x0)))))
((consp x0)
(let* ((x23 (car-safe x0)))
(if (eq x23 'lambda) (funcall pcase-3 x0 x14)
(funcall pcase-2 x0))))
(t (funcall pcase-2 x0)))))
((consp x0)
(let* ((x25 (car-safe x0)))
(if (eq x25 'lambda) (funcall pcase-3 x0 x14)
(funcall pcase-2 x0))))
(t (funcall pcase-2 x0)))))
((consp x0)
(let* ((x27 (car-safe x0)))
(if (eq x27 'lambda) (funcall pcase-3 x0 x14)
(funcall pcase-2 x0))))
(t (funcall pcase-2 x0)))))
((consp x0)
(let* ((x29 (car-safe x0)))
(if (eq x29 'lambda) (funcall pcase-3 x0 x14) (funcall pcase-2 x0))))
(t (funcall pcase-2 x0)))))
((consp x0)
(let* ((x31 (car-safe x0)))
(if (eq x31 'lambda)
(let* ((x33 (cdr-safe form))) (funcall pcase-3 x0 x33))
(funcall pcase-2 x0))))
(t (funcall pcase-2 x0))))
.. This contains errors:
(i) Although it has been established that x0 is 'defalias, there are many
tests (consp x0).
(ii) There are calls of the form (funcall pcase-2 x0), i.e. (funcall
pcase-2 'defalias). This causes a wrong-number-of-arguments error.
(iii) There is no sign of the final `form' being returned, though this
may be being done elsewhere.
--
Alan Mackenzie (Nuremberg, Germany).
- bug#68938: Emacs "master". Incorrect code generated by pcase.,
Alan Mackenzie <=