From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8793 invoked by alias); 14 Sep 2016 09:19:41 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 21903 Received: (qmail 6394 invoked from network); 14 Sep 2016 09:19:41 -0000 X-Qmail-Scanner-Diagnostics: from mailout2.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(210.118.77.12):SA:0(-2.3/5.0):. Processed in 0.527292 secs); 14 Sep 2016 09:19:41 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=RP_MATCHES_RCVD autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at samsung.com does not designate permitted sender hosts) X-AuditID: cbfec7f5-f79ce6d000004c54-72-57d91625cdda Date: Wed, 14 Sep 2016 10:19:29 +0100 From: Peter Stephenson To: Ronald Fischer , Zsh Mailing-List Subject: Re: Possible bug: Zsh function does not terminate when ${name:?word} fails Message-id: <20160914101929.772d4606@pwslap01u.europe.root.pri> In-reply-to: <1473840044.77968.725190513.460F8572@webmail.messagingengine.com> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrCIsWRmVeSWpSXmKPExsWy7djP87qqYjfDDb5/FbLYfM7OYsfJlYwO TB7vHn1k9lh18ANTAFMUl01Kak5mWWqRvl0CV8akY54FlyUqlq23b2A8LtjFyMkhIWAi8ejc DTYIW0ziwr31QDYXh5DAUkaJFRfnskI4nxkl5jzcxATTsXltNztEYhmjxK8jx6Gq/gE5t6+x g1QJCZxhlHjxrxYicZZRovHRFLAEi4CqxPNvz1hBbDYBQ4mpm2YzgtgiAm4SjWsXsIDYwgKh Ev0P34PV8ArYS5ya2QO2mlPAT+Lu0gawY/kF9CWu/v0EdZK9xMwrZxgh6gUlfky+BzaHWUBH Ytu2x+wQtrzE5jVvmUEOkhDoZpe4OuM80CAOIEdWYtMBZog5LhLdC1qgZgpLvDq+hR3ClpG4 PLmbBcLuZ5R40u0LMWcGo8TpMzugoWct0Xf7IiPEMj6JSdumM0PM55XoaBOCKPGQOHb3HNRM R4m9e2+zT2BUnIXk7FlIzp6F5OwFjMyrGEVSS4tz01OLTfWKE3OLS/PS9ZLzczcxAtPC6X/H v+5gXHrM6hCjAAejEg9vwI/r4UKsiWXFlbmHGCU4mJVEeGWFboYL8aYkVlalFuXHF5XmpBYf YpTmYFES592z4Eq4kEB6YklqdmpqQWoRTJaJg1OqgVFeqn3nsp4bOYkX26qZzykYXZvL+e2J a4QpJ+up914T3vid0lbwf2xkuXabStG1S3qORcsOe5et/D1v9pvzhmw6nGG1Ut2TtdQqNVkW rvsQGs7hfCr4cu/5D9v6ufIyf98wNp66yfxZ6oa7a//tvPCPOXSCpvvh+Y2zbR0Xn2H72M0e ExTr8FCJpTgj0VCLuag4EQBoGw5sBwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrLIsWRmVeSWpSXmKPExsVy+t/xy7pfRG+GG2x8pmqx+ZydxY6TKxkd mDzePfrI7LHq4AemAKYoN5uM1MSU1CKF1Lzk/JTMvHRbpdAQN10LJYW8xNxUW6UIXd+QICWF ssScUiDPyAANODgHuAcr6dsluGVMOuZZcFmiYtl6+wbG44JdjJwcEgImEpvXdrND2GISF+6t Z+ti5OIQEljCKLHh8SsmCKeBSeJ01wGozDlGibsbd7JDOGcZJd7/XgLWzyKgKvH82zNWEJtN wFBi6qbZjCC2iICbROPaBSxdjBwcwgKhEq8+WYCEeQXsJU7N7GECsTkF/CTuLm2AWrCYUeL3 tNdgCX4BfYmrfz8xQdxnLzHzyhlGiGZBiR+T77GA2MwCWhKbtzWxQtjyEpvXvGUGsYUE1CVu 3N3NPoFReBaSlllIWmYhaVnAyLyKUSS1tDg3PbfYSK84Mbe4NC9dLzk/dxMjMKq2Hfu5ZQdj 17vgQ4wCHIxKPLwBP66HC7EmlhVX5h5ilOBgVhLhlRW6GS7Em5JYWZValB9fVJqTWnyI0RQY MBOZpUST84ERn1cSb2hiaG5paGRsYWFuZKQkzjv1w5VwIYH0xJLU7NTUgtQimD4mDk6pBsZa TdabCh9+HZ+f79aWf3CtmPQsyzJ9XtvefadU5yZfLH9xKOIt+6+rjZ/1An2c9K3m/YtiLt3N +jdQZF4S85FsNhk7rl2L1x2OYa8Rn6fRwtcZ3Cu7w0xBhU/2/VkRBb0DbEr9GgtX7+5u9V0s O0O+Ls3M7ETMla+PK6o2fSljnaXZIXBBQomlOCPRUIu5qDgRACkGAL3AAgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20160914091932eucas1p24fb3e084d6151ef150873aad18942d0b X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUb?= =?UTF-8?B?7IK87ISx7KCE7J6QG1ByaW5jaXBhbCBFbmdpbmVlciwgU29mdHdhcmU=?= X-Global-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUbU2Ft?= =?UTF-8?B?c3VuZyBFbGVjdHJvbmljcxtQcmluY2lwYWwgRW5naW5lZXIsIFNvZnR3YXJl?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDA1Q0QwNTAwNTg=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20160914080154eucas1p11c49e4dd5f0d45f92deaef1ce08099de X-RootMTR: 20160914080154eucas1p11c49e4dd5f0d45f92deaef1ce08099de References: <1473840044.77968.725190513.460F8572@webmail.messagingengine.com> On Wed, 14 Sep 2016 10:00:44 +0200 Ronald Fischer wrote: > I have in my .zshrc the following function definition (simplified > example): > > function foo { > local p=${1:?parameter missing} > echo continue .... > } > > Running the function by just typing foo produces, as expected, the > message parameter missing, but it also outputs continue. I had expected > that the function terminates when the :? check fails, but it continues > to run. Yes, that's a bug. As documented it should return to the top-level prompt when interactive --- that means it will abort not just the function but any surrounding code. If that's not what you want you might want to look at the ERR_RETURN option as an alternative. I have to admit the resetting of error flags in zsh is something I've never got properly to grips with, but now we have individual bits in the errflag status variable this is straightforward to fix; most of the logic we need is already there. The lack of that until a couple of years ago may be why this has been the way it has for so long. pws diff --git a/Src/subst.c b/Src/subst.c index 1c2027f..92fde45 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2922,6 +2922,13 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, if (isset(EXECOPT)) { *idend = '\0'; zerr("%s: %s", idbeg, *s ? s : "parameter not set"); + /* + * In interactive shell we need to return to + * top-level prompt --- don't clear this error + * after handling a command as we do with + * most errors. + */ + errflag |= ERRFLAG_HARD; if (!interact) { if (mypid == getpid()) { /* diff --git a/Src/zsh.h b/Src/zsh.h index 996bc33..2dc5e7e 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -2807,7 +2807,14 @@ enum errflag_bits { /* * User interrupt. */ - ERRFLAG_INT = 2 + ERRFLAG_INT = 2, + /* + * Hard error --- return to top-level prompt in interactive + * shell. In non-interactive shell we'll typically already + * have exited. This is reset by "errflag = 0" in + * loop(toplevel = 1, ...). + */ + ERRFLAG_HARD = 4 }; /***********/ diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index be6e104..7623051 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -95,6 +95,20 @@ ?(eval):1: unset1: exiting1 ?(eval):2: null1: exiting2 + PROMPT="" $ZTST_testdir/../Src/zsh -fis <<<' + unsetopt PROMPT_SP + PS2="" PS3="" PS4="" RPS1="" RPS2="" + foo() { + print ${1:?no arguments given} + print not reached + } + foo + print reached + ' +0:interactive shell returns to top level on ${...?...} error +?foo:1: 1: no arguments given +>reached + print ${set1:+word1} ${set1+word2} ${null1:+word3} ${null1+word4} print ${unset1:+word5} ${unset1+word6} 0:${...:+...}, ${...+...}