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:
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);