Fix condition-case empty success handler misinterpretation

(condition-case X E (:success)) should return nil; the compiler
behaves correctly in this case.

* src/eval.c (internal_lisp_condition_case):
Evaluate an empty :success handler as nil instead of pretending it
isn't there.
* test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases):
Add test case.
This commit is contained in:
Mattias Engdegård 2022-12-24 10:39:57 +01:00
parent 8bb8cc5b49
commit 1748361c68
2 changed files with 8 additions and 3 deletions

View file

@ -1367,7 +1367,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
error ("Invalid condition handler: %s",
SDATA (Fprin1_to_string (tem, Qt, Qnil)));
if (CONSP (tem) && EQ (XCAR (tem), QCsuccess))
success_handler = XCDR (tem);
success_handler = tem;
else
clausenb++;
}
@ -1430,7 +1430,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
if (!NILP (success_handler))
{
if (NILP (var))
return Fprogn (success_handler);
return Fprogn (XCDR (success_handler));
Lisp_Object handler_var = var;
if (!NILP (Vinternal_interpreter_environment))
@ -1442,7 +1442,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
specpdl_ref count = SPECPDL_INDEX ();
specbind (handler_var, result);
return unbind_to (count, Fprogn (success_handler));
return unbind_to (count, Fprogn (XCDR (success_handler)));
}
return result;
}

View file

@ -752,6 +752,11 @@ inner loops respectively."
(condition-case nil
(characterp x) ; value (no :success, no var)
(error 'bad)))
(condition-case nil
(bytecomp-test-identity 3)
(error 'bad)
(:success)) ; empty handler
)
"List of expressions for cross-testing interpreted and compiled code.")