zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit befbe18ebc89b719e1f6ec9a6c48d2b588de8d02 (tree)
parent b3d106ec971300a9c745f4681fab3df7518c4346
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date:   Fri, 13 Feb 2026 21:22:53 +0000

parser: fix while-type-expr continue parsing and comptime labeled blocks

Fix two parser bugs found by auditing against upstream Parse.zig:

1. In parseTypeExpr's while case, the continue expression was parsed
   inline as `eatToken(COLON) ? expectExpr : 0` which missed the
   required parentheses. Use parseWhileContinueExpr(p) instead,
   matching what parseWhileExpr already does.

2. In expectStatement, comptime blocks used parseBlock() which only
   matches `{ ... }`. Use parseBlockExpr() to also recognize labeled
   blocks like `comptime label: { ... }`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Diffstat:
Mparser.c | 5++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/parser.c b/parser.c @@ -711,7 +711,7 @@ static AstNodeIndex expectStatement(Parser* p, bool allow_defer_var) { const AstTokenIndex comptime_token = eatToken(p, TOKEN_KEYWORD_COMPTIME); if (comptime_token != null_token) { // comptime followed by block => comptime block statement - const AstNodeIndex block = parseBlock(p); + const AstNodeIndex block = parseBlockExpr(p); if (block != 0) { return addNode(&p->nodes, (AstNodeItem) { @@ -1728,8 +1728,7 @@ static AstNodeIndex parseTypeExpr(Parser* p) { const AstNodeIndex condition = expectExpr(p); expectToken(p, TOKEN_R_PAREN); parsePtrPayload(p); - const AstNodeIndex cont_expr - = eatToken(p, TOKEN_COLON) != null_token ? expectExpr(p) : 0; + const AstNodeIndex cont_expr = parseWhileContinueExpr(p); const AstNodeIndex body = parseTypeExpr(p); if (eatToken(p, TOKEN_KEYWORD_ELSE) != null_token) { parsePayload(p);