From 7d1877da4e6fabde8f0b5eb2f9a9f03d83e6c28d Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Sun, 27 Aug 2017 20:28:38 +0100
Subject: 41608 (plus tests): restore ERR_EXIT before function.
There was an exception to the usual ERR_EXIT pattern that causes
problems when executing a function in an else branch. It seems
the exception is no longer needed as the regression tests pass
without it.
---
ChangeLog | 5 +++++
Src/exec.c | 2 +-
Test/C03traps.ztst | 35 +++++++++++++++++++++++++++++++++++
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/ChangeLog b/ChangeLog
index 39042f8e0..307a02b86 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-08-27 Peter Stephenson
+
+ * 41608 (plus tests): Src/exec.c, Test/C03traps.ztst: ERR_EXIT
+ behaviour restored when executing a function in body of else.
+
2017-08-29 Андрей Стоцкий (_RuRo_)
* 41618: Completion/Unix/Command/_todo.sh: Added some arguments
diff --git a/Src/exec.c b/Src/exec.c
index cd99733f1..76a6bb1a4 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3025,7 +3025,7 @@ execcmd_exec(Estate state, Execcmd_params eparams,
preargs = NULL;
/* if we get this far, it is OK to pay attention to lastval again */
- if ((noerrexit & NOERREXIT_UNTIL_EXEC) && !is_shfunc)
+ if (noerrexit & NOERREXIT_UNTIL_EXEC)
noerrexit = 0;
/* Do prefork substitutions.
diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst
index 759401225..f8a12319a 100644
--- a/Test/C03traps.ztst
+++ b/Test/C03traps.ztst
@@ -465,6 +465,41 @@
)
1:ERREXIT in loop with simple commands
+ (set -e
+ f()
+ {
+ false && false
+ }
+ if false; then
+ :
+ else
+ # ERR_EXIT should trigger on return from function, not in function.
+ f
+ echo Fail 1
+ echo Fail 2
+ f
+ echo Fail 3
+ fi)
+1:ERREXIT with false from inside && within function
+
+ (set -e
+ f()
+ {
+ }
+ if false; then
+ :
+ else
+ f
+ echo Succeed 1
+ echo Succeed 2
+ f
+ echo Succeed 3
+ fi)
+0:ERREXIT not triggered on empty function after false in if.
+>Succeed 1
+>Succeed 2
+>Succeed 3
+
fn() {
emulate -L zsh
setopt errreturn
--
cgit 1.4.1