Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Bug with continue?
- X-seq: zsh-workers 51607
- From: Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
- To: zsh workers <zsh-workers@xxxxxxx>
- Subject: Re: Bug with continue?
- Date: Tue, 28 Mar 2023 12:56:54 +0100 (BST)
- Archived-at: <https://zsh.org/workers/51607>
- Importance: Normal
- In-reply-to: <805138511.3622784.1680002886460@mail.virginmedia.com>
- List-id: <zsh-workers.zsh.org>
- References: <CAMP44s3NCDJU9TcSuSgy5oH=-iK3zpP3Vc1+95d3n16uydHhFA@mail.gmail.com> <16795430.3614208.1679998628194@mail.virginmedia.com> <805138511.3622784.1680002886460@mail.virginmedia.com>
> 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