about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <p.w.stephenson@ntlworld.com>2017-08-27 20:28:38 +0100
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2017-08-29 19:52:18 +0100
commit7d1877da4e6fabde8f0b5eb2f9a9f03d83e6c28d (patch)
tree04cd41bdb22033f01fbd04f6e6b691a15f400108
parent8b4d2329c71377fcab7d73bc0656094557c720a9 (diff)
downloadzsh-7d1877da4e6fabde8f0b5eb2f9a9f03d83e6c28d.tar.gz
zsh-7d1877da4e6fabde8f0b5eb2f9a9f03d83e6c28d.tar.xz
zsh-7d1877da4e6fabde8f0b5eb2f9a9f03d83e6c28d.zip
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.
-rw-r--r--ChangeLog5
-rw-r--r--Src/exec.c2
-rw-r--r--Test/C03traps.ztst35
3 files changed, 41 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 39042f8e0..307a02b86 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-08-27  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* 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_)  <ruro.ruro@ya.ru>
 
 	* 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