1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-04 08:47:11 +00:00

gv.el and cl-macs.el: Fix bug#57397

* lisp/emacs-lisp/gv.el (gv-get): Obey symbol macros.
* lisp/emacs-lisp/cl-macs.el (cl--letf): Remove workaround placed to
try and handle symbol macros.

* test/lisp/emacs-lisp/cl-macs-tests.el (cl-macs-test--symbol-macrolet):
Add new testcase.
This commit is contained in:
Stefan Monnier 2022-09-03 22:38:28 -04:00
parent 1d1158397b
commit 2dd1c2ab19
3 changed files with 20 additions and 3 deletions

View File

@ -2762,7 +2762,7 @@ Each PLACE may be a symbol, or any generalized variable allowed by `setf'.
(funcall setter vold)))
binds))))
(let* ((binding (car bindings))
(place (macroexpand (car binding) macroexpand-all-environment)))
(place (car binding)))
(gv-letplace (getter setter) place
(macroexp-let2 nil vnew (cadr binding)
(if (symbolp place)

View File

@ -87,7 +87,11 @@ with a (not necessarily copyable) Elisp expression that returns the value to
set it to.
DO must return an Elisp expression."
(cond
((symbolp place) (funcall do place (lambda (v) `(setq ,place ,v))))
((symbolp place)
(let ((me (macroexpand-1 place macroexpand-all-environment)))
(if (eq me place)
(funcall do place (lambda (v) `(setq ,place ,v)))
(gv-get me do))))
((not (consp place)) (signal 'gv-invalid-place (list place)))
(t
(let* ((head (car place))

View File

@ -539,7 +539,20 @@ collection clause."
((p (gv-synthetic-place cl (lambda (v) `(setcar l ,v)))))
(cl-incf p)))
l)
'(1))))
'(1)))
;; Make sure `gv-synthetic-place' isn't macro-expanded before
;; `cl-letf' gets to see its `gv-expander'.
(should (equal
(condition-case err
(let ((x 1))
(list x
(cl-letf (((gv-synthetic-place (+ 1 2)
(lambda (v) `(setq x ,v)))
7))
x)
x))
(error err))
'(1 7 3))))
(ert-deftest cl-macs-loop-conditional-step-clauses ()
"These tests failed under the initial fixes in #bug#29799."