summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2017-08-31 16:54:19 +0100
committerPeter Stephenson <pws@zsh.org>2017-08-31 16:54:19 +0100
commitebcea98eca33b8894d29545f1a46331d03f3913a (patch)
tree6b834b6b2ddc7ed63f947154c52d99bf648943a4 /Src
parent73514c40f68fd7f66b64317d6e26793d400414ac (diff)
downloadzsh-ebcea98eca33b8894d29545f1a46331d03f3913a.tar.gz
zsh-ebcea98eca33b8894d29545f1a46331d03f3913a.zip
Fix problem with ERR_RETURN.
It wasn't suppressed properly in the code following an if in some circumstances, in particular in initialsation scripts and also in a nested function where the caller had suppressed it.
Diffstat (limited to 'Src')
-rw-r--r--Src/loop.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/Src/loop.c b/Src/loop.c
index 4859c976b..40e3bcb34 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -541,8 +541,7 @@ execif(Estate state, int do_exec)
olderrexit = noerrexit;
end = state->pc + WC_IF_SKIP(code);
- if (!noerrexit)
- noerrexit = NOERREXIT_EXIT | NOERREXIT_RETURN;
+ noerrexit |= NOERREXIT_EXIT | NOERREXIT_RETURN;
while (state->pc < end) {
code = *state->pc++;
if (wc_code(code) != WC_IF ||
@@ -570,9 +569,9 @@ execif(Estate state, int do_exec)
if (olderrexit)
noerrexit = olderrexit;
else if (lastval)
- noerrexit = NOERREXIT_EXIT | NOERREXIT_RETURN | NOERREXIT_UNTIL_EXEC;
+ noerrexit |= NOERREXIT_EXIT | NOERREXIT_RETURN | NOERREXIT_UNTIL_EXEC;
else
- noerrexit = 0;
+ noerrexit &= ~ (NOERREXIT_EXIT | NOERREXIT_RETURN);
cmdpush(run == 2 ? CS_ELSE : (s ? CS_ELIFTHEN : CS_IFTHEN));
execlist(state, 1, do_exec);
cmdpop();