about summary refs log tree commit diff
path: root/Doc
diff options
context:
space:
mode:
authorDaniel Shahaf <danielsh@apache.org>2019-12-21 12:41:03 +0000
committerDaniel Shahaf <danielsh@apache.org>2019-12-22 03:21:09 +0000
commita0c0aa41d2ac632529f795a02519b1def00b53cc (patch)
treea19dac672a6ae11c8b1209dfe62ae531cb3b329c /Doc
parent105ca83aa2e8c16df4f83754f8b43f349032650c (diff)
downloadzsh-a0c0aa41d2ac632529f795a02519b1def00b53cc.tar.gz
zsh-a0c0aa41d2ac632529f795a02519b1def00b53cc.tar.xz
zsh-a0c0aa41d2ac632529f795a02519b1def00b53cc.zip
45111: zshmisc(1): Clarify the documentation of 'return' and 'exit' in conjunction with try/always
Having reviewed 20076, 20084, 21734, and 21735, my understanding is that
the original intention was:

- A 'return' in a function does run always-list
- An 'exit' outside a function does not run always-list
- A 'return' outside a function is treated as an 'exit'

All of which are the case today.  The remaining case, of 'exit' used
inside a function, was not specified by the referenced -workers@ posts;
does, as implemented, run the always-list; and furthermore, based in
21734 it's fair to assume that the original documentation was assuming
that 'exit' would be used outside of any function, just like it assumed
'return' would be used inside a function.

Therefore, have the documentation specify only the behaviour of 'exit'
outside any function, and leave the behaviour of 'exit' inside
a function unspecified.  Anyone who relied on the documentation of 'exit'
as documented until this commit would have run into the
documentation/implementation discrepancy described in 45075.
Diffstat (limited to 'Doc')
-rw-r--r--Doc/Zsh/grammar.yo16
1 files changed, 11 insertions, 5 deletions
diff --git a/Doc/Zsh/grammar.yo b/Doc/Zsh/grammar.yo
index d30c9d2d7..a66358ed6 100644
--- a/Doc/Zsh/grammar.yo
+++ b/Doc/Zsh/grammar.yo
@@ -297,11 +297,11 @@ findex(always)
 cindex(always blocks)
 cindex(try blocks)
 item(tt({) var(try-list) tt(} always {) var(always-list) tt(}))(
-First execute var(try-list).  Regardless of errors, or tt(break),
-tt(continue), or tt(return) commands encountered within var(try-list),
+First execute var(try-list).  Regardless of errors, or tt(break) or
+tt(continue) commands encountered within var(try-list),
 execute var(always-list).  Execution then continues from the
 result of the execution of var(try-list); in other words, any error,
-or tt(break), tt(continue), or tt(return) command is treated in the
+or tt(break) or tt(continue) command is treated in the
 normal way, as if var(always-list) were not present.  The two
 chunks of code are referred to as the `try block' and the `always block'.
 
@@ -345,10 +345,16 @@ example({
 }
 # The error condition has been reset.)
 
-An tt(exit) command (or a tt(return) command executed at the outermost
-function level of a script) encountered in tt(try-list) does em(not) cause
+When a tt(try) block occurs outside of any function, 
+a tt(return) or a tt(exit) encountered in var(try-list) does em(not) cause
 the execution of var(always-list).  Instead, the shell exits immediately
 after any tt(EXIT) trap has been executed.
+Otherwise, a tt(return) command encountered in var(try-list) will cause the
+execution of var(always-list), just like tt(break) and tt(continue).
+
+COMMENT(The semantics of calling 'exit' in try-list inside a function are
+deliberately left unspecified, because historically there was a mismatch between
+the documented and implemented behaviours.  Cf. 20076, 21734/21735, 45075.)
 )
 findex(function)
 xitem(tt(function) var(word) ... [ tt(()) ] [ var(term) ] tt({) var(list) tt(}))