Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Bug with continue?



> On 28/03/2023 12:28 Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx> wrote:
> > On 28/03/2023 11:17 Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx> wrote:
> > > On 28/03/2023 10:32 Felipe Contreras <felipe.contreras@xxxxxxxxx> wrote:
> > > I notice this works differently in zsh than in other shells:
> > > 
> > >   for x in 1 2 3 4; do
> > >     continue &&
> > >     list="$list$x " &&
> > >     echo "x: $x"
> > >   done
> > >   echo "list: $list"
> > > 
> > > Why did the statement after `continue` gets evaluated?
>...
> The bug I'm thinking of is zsh-workers/51125, though it looks like I
> committed the fix under zsh-workers/51134.  That was about wheter
> "! return" should invert the status of the return given it's already
> returned by the time that would happen.  This is similar, but looks
> like it's not the same.
> 
> This one is a little weird as if the immediately next statement is a
> print it doesn't get executed.  I'm suspecting some subtlety with handling
> retflag.
> 
> pws

(I meant "breaks", of course.)  Redirected to zsh-workers as previously
advertised.

"breaks" means multiple things, but I think they all have the same
implication for a successful "continue".  If I can think of some
further useful tests I'll add them.

Added the corresponding test for return for safety.

pws

diff --git a/Src/exec.c b/Src/exec.c
index 3330bbce8..6454e4ccf 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1491,7 +1491,7 @@ execlist(Estate state, int dont_change_job, int exiting)
 		 * we find a sublist followed by ORNEXT.                   */
 		if ((ret = ((WC_SUBLIST_FLAGS(code) & WC_SUBLIST_SIMPLE) ?
 			    execsimple(state) :
-			    execpline(state, code, Z_SYNC, 0)))) {
+			    execpline(state, code, Z_SYNC, 0))) || breaks) {
 		    state->pc = next;
 		    code = *state->pc++;
 		    next = state->pc + WC_SUBLIST_SKIP(code);
diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst
index b3aea1055..88928980f 100644
--- a/Test/A01grammar.ztst
+++ b/Test/A01grammar.ztst
@@ -982,3 +982,21 @@ F:its expectations.
  }
  fn
 1:! does not affect return status of explicit return
+
+  msg=unset
+  for x in 1 2 3 4 5; do
+    continue && msg=set && print Not executed
+    print Not executed, neither.
+  done
+  print $msg
+0:continue causes immediate continuation
+>unset
+
+  msg=unset
+  () {
+    return && msg=set && print Not executed
+    print Not executed, not nor neither.
+  }
+  print $msg
+0:return causes immediate return
+>unset




Messages sorted by: Reverse Date, Date, Thread, Author