Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm
Precedence: bulk
X-No-Archive: yes
List-Id: Zsh Workers List <zsh-workers.zsh.org>
List-Post: <mailto:zsh-workers@zsh.org>
List-Help: <mailto:zsh-workers-help@zsh.org>
X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham
	autolearn_force=no version=3.4.1
X-AuditID: cbfec7f4-f796c6d000001486-ed-576952d38442
Date: Tue, 21 Jun 2016 15:44:32 +0100
From: Peter Stephenson <p.stephenson@samsung.com>
To: Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: PATCH: case pattern parsing
Message-id: <20160621154432.0f165444@pwslap01u.europe.root.pri>
In-reply-to: <19007.1466508129@thecus.kiddle.eu>
References: <20150517215341.223ef620@ntlworld.com>
 <19007.1466508129@thecus.kiddle.eu>
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+NgFrrILMWRmVeSWpSXmKPExsVy+t/xK7qXgzLDDdp/MVkcbH7I5MDoserg
	B6YAxigum5TUnMyy1CJ9uwSujGdLzjAVPOas2NK5jqmB8RJ7FyMnh4SAicTJbb3MELaYxIV7
	69m6GLk4hASWMkpMu7WIHcKZwSSxf/pEVgjnHKPE9tZTLBDOWUaJGQ+fgs1iEVCVuLjsBguI
	zSZgKDF102xGEFtEQEtix8mTTCC2sICGxITZR9lAbF4Be4kVJ1vAdnMKGEhcnnAGLC4kECGx
	duZ1sDi/gL7E1b+fmCDus5eYeeUMI0SvoMSPyffAdjEDzd+8rYkVwpaX2LzmLTPEHHWJG3d3
	s09gFJ6FpGUWkpZZSFoWMDKvYhRNLU0uKE5KzzXUK07MLS7NS9dLzs/dxAgJ6C87GBcfszrE
	KMDBqMTDq6CfES7EmlhWXJl7iFGCg1lJhPeFb2a4EG9KYmVValF+fFFpTmrxIUZpDhYlcd65
	u96HCAmkJ5akZqemFqQWwWSZODilGhgNcrxdBNcUax86VcoYLxW4QSCj4khc5o+GFc/iVkv1
	Fe8oC9zHcc7mpF73txzW1esu7mopnOAamr/NbMetnMr9SyRcpNa2PJnjxX3F6deen2FFnyz/
	OK9VFDv+zav19a1lye1tLZcE701V5Uk+0xB+qG2e/kFFr5XrRYtTmb9eWu/8yrltm44SS3FG
	oqEWc1FxIgAvloLUZAIAAA==
X-Seq: zsh-workers 38734

On Tue, 21 Jun 2016 13:22:09 +0200
Oliver Kiddle <okiddle@yahoo.co.uk> wrote:
> I noticed a bug with case statements which git bisect tracks to this
> change (workers/35168 or 52aeb9aa). It occurs with a fall-through at the
> end of the case statement:
> 
>   case whatever in
>     *) ;&
>   esac

diff --git a/Src/loop.c b/Src/loop.c
index 19d7f73..fa7602e 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -660,7 +660,7 @@ execcase(Estate state, int do_exec)
 	    execlist(state, 1, ((WC_CASE_TYPE(code) == WC_CASE_OR) &&
 				do_exec));
 	    while (!retflag && wc_code(code) == WC_CASE &&
-		   WC_CASE_TYPE(code) == WC_CASE_AND) {
+		   WC_CASE_TYPE(code) == WC_CASE_AND && state->pc < end) {
 		state->pc = next;
 		code = *state->pc++;
 		next = state->pc + WC_CASE_SKIP(code);
diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst
index 7eedfa6..394480c 100644
--- a/Test/A01grammar.ztst
+++ b/Test/A01grammar.ztst
@@ -283,6 +283,14 @@
 >2
 >3
 
+  case whatever in
+  (*) print yeah, right ;&
+  esac
+  print but well
+0:'case', redundant final ";&"
+>yeah, right
+>but well
+
 ## Select now reads from stdin if the shell is not interactive.
 ## Its own output goes to stderr.
   (COLUMNS=80 LINES=3

