diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/loop.c | 8 | ||||
-rw-r--r-- | Test/A01grammar.ztst | 10 |
3 files changed, 22 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 52b9bcd51..e0635dda8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2019-05-03 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 44271: Src/loop.c, Test/A01grammar.ztst: until with positive + and while with negative status propagated breaks too far after a + return, causing code in enclosing scope not to run. + 2019-04-26 dana <dana@dana.is> * 44234: Completion/Unix/Command/_ssh: Update for OpenSSH 8.0 diff --git a/Src/loop.c b/Src/loop.c index 1013aeb50..3fa7006aa 100644 --- a/Src/loop.c +++ b/Src/loop.c @@ -425,7 +425,7 @@ execwhile(Estate state, UNUSED(int do_exec)) breaks--; simple_pline = old_simple_pline; - } else + } else { for (;;) { state->pc = loop; noerrexit = NOERREXIT_EXIT | NOERREXIT_RETURN; @@ -445,8 +445,11 @@ execwhile(Estate state, UNUSED(int do_exec)) lastval = oldval; break; } - if (retflag) + if (retflag) { + if (breaks) + breaks--; break; + } /* In case the loop body is also a functional no-op, * make sure signal handlers recognize ^C as above. */ @@ -470,6 +473,7 @@ execwhile(Estate state, UNUSED(int do_exec)) freeheap(); oldval = lastval; } + } cmdpop(); popheap(); loops--; diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst index 339ce7494..1ed3cb6b7 100644 --- a/Test/A01grammar.ztst +++ b/Test/A01grammar.ztst @@ -640,6 +640,16 @@ >1 >0 + echo 'echo dot + until return 42; do + : + done' >until_dot + . ./until_dot + echo After dot +0:return in positive until test in dot file does not cause excess breaks +>dot +>After dot + echo 'echo $?' >dot_status false . ./dot_status |