mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-17 10:27:41 +00:00
Fix cond miscompilation bug
This fixes a bug that miscompiled (cond ... C S1...Sn) where S1...Sn are switch clauses (that can be compiled into a switch op) and C a non-switch clause, by tucking on an extra copy of C at the end. This was a serious wrong-code bug when the condition of C had side-effects; otherwise it was only a waste of time and space. * lisp/emacs-lisp/bytecomp.el (byte-compile-cond): Fix. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases): Add test case.
This commit is contained in:
parent
a1d90e48bb
commit
828c49ae29
2 changed files with 10 additions and 0 deletions
|
|
@ -4590,6 +4590,7 @@ Return (TAIL VAR TEST CASES), where:
|
|||
(if switch-prefix
|
||||
(progn
|
||||
(byte-compile-cond-jump-table (cdr switch-prefix) donetag)
|
||||
(setq clause nil)
|
||||
(setq clauses (car switch-prefix)))
|
||||
(setq clause (car clauses))
|
||||
(cond ((or (eq (car clause) t)
|
||||
|
|
|
|||
|
|
@ -757,6 +757,15 @@ inner loops respectively."
|
|||
(bytecomp-test-identity 3)
|
||||
(error 'bad)
|
||||
(:success)) ; empty handler
|
||||
|
||||
;; `cond' miscompilation bug
|
||||
(let ((fn (lambda (x)
|
||||
(let ((y nil))
|
||||
(cond ((progn (setq x (1+ x)) (> x 10)) (setq y 'a))
|
||||
((eq x 1) (setq y 'b))
|
||||
((eq x 2) (setq y 'c)))
|
||||
(list x y)))))
|
||||
(mapcar fn (bytecomp-test-identity '(0 1 2 3 10 11))))
|
||||
)
|
||||
"List of expressions for cross-testing interpreted and compiled code.")
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue