Fix condition-case body for-effect miscompilation

(condition-case x A (:success B)) should not compile A for-effect even
if the entire form is in for-effect context.

* lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
Don't optimise the condition-case body form for effect (potentially
discarding its value) if there is a success handler and a variable.
* test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases):
Add test cases.
This commit is contained in:
Mattias Engdegård 2022-12-23 20:04:22 +01:00
parent cc2cc0c297
commit 8bb8cc5b49
2 changed files with 52 additions and 1 deletions

View file

@ -410,7 +410,10 @@ for speeding up processing.")
(`(condition-case ,var ,exp . ,clauses)
`(,fn ,var ;Not evaluated.
,(byte-optimize-form exp for-effect)
,(byte-optimize-form exp
(if (assq :success clauses)
(null var)
for-effect))
,@(mapcar (lambda (clause)
(let ((byte-optimize--lexvars
(and lexical-binding