zig

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

commit bc5de7b59d76a1ad99b3923ce1f2ca34769818e3 (tree)
parent 0df3e81e6adb3e51224201d8ff326a369d416a26
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date:   Fri, 13 Feb 2026 15:27:02 +0000

astgen: fix dbg_stmt cursor save, comptime guard, array_access

- Save source cursor before evaluating sub-expressions in array_access
  and @tagName (cursor was being mutated by inner expr calls)
- Add is_comptime guard to advanceSourceCursorToMainToken matching
  upstream maybeAdvanceSourceCursorToMainToken (skip in comptime)
- Re-skip astgen_test.zig corpus (dbg_stmt mismatch remains at inst 1557)

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

Diffstat:
Mastgen.c | 51++++++++++++++++++++++++++++++---------------------
Mastgen_test.zig | 2+-
2 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/astgen.c b/astgen.c @@ -825,7 +825,11 @@ static void advanceSourceCursorToNode(AstGenCtx* ag, uint32_t node) { } // Mirrors maybeAdvanceSourceCursorToMainToken (AstGen.zig:13324). -static void advanceSourceCursorToMainToken(AstGenCtx* ag, uint32_t node) { +// Skips advancing when in comptime scope (matching upstream behavior). +static void advanceSourceCursorToMainToken( + AstGenCtx* ag, const GenZir* gz, uint32_t node) { + if (gz->is_comptime) + return; uint32_t main_tok = ag->tree->nodes.main_tokens[node]; uint32_t token_start = ag->tree->tokens.starts[main_tok]; advanceSourceCursor(ag, token_start); @@ -2448,7 +2452,7 @@ static uint32_t builtinCall( } // @intCast — typeCast pattern (AstGen.zig:9416, 9807-9826). if (name_len == 7 && memcmp(source + name_start, "intCast", 7) == 0) { - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t result_type = rlResultType(gz, rl, node); @@ -2472,10 +2476,12 @@ static uint32_t builtinCall( } // @tagName (AstGen.zig:9407) — simpleUnOp with dbg_stmt. if (name_len == 7 && memcmp(source + name_start, "tagName", 7) == 0) { - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); + uint32_t saved_line = ag->source_line - gz->decl_line; + uint32_t saved_col = ag->source_column; AstData nd = tree->nodes.datas[node]; uint32_t operand = expr(gz, scope, nd.lhs); - emitDbgStmt(gz, ag->source_line - gz->decl_line, ag->source_column); + emitDbgStmt(gz, saved_line, saved_col); return addUnNode(gz, ZIR_INST_TAG_NAME, operand, node); } // @as (AstGen.zig:9388). @@ -2487,7 +2493,7 @@ static uint32_t builtinCall( } // @truncate — typeCast pattern (AstGen.zig:9417, 9807-9826). if (name_len == 8 && memcmp(source + name_start, "truncate", 8) == 0) { - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t result_type = rlResultType(gz, rl, node); @@ -2499,7 +2505,7 @@ static uint32_t builtinCall( } // @ptrCast — typeCast pattern (AstGen.zig:9056, 9807-9826). if (name_len == 7 && memcmp(source + name_start, "ptrCast", 7) == 0) { - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t result_type = rlResultType(gz, rl, node); @@ -2511,7 +2517,7 @@ static uint32_t builtinCall( } // @enumFromInt — typeCast pattern (AstGen.zig:9414, 9807-9826). if (name_len == 11 && memcmp(source + name_start, "enumFromInt", 11) == 0) { - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t result_type = rlResultType(gz, rl, node); @@ -2757,7 +2763,7 @@ static uint32_t fieldAccessExpr( uint32_t lhs = exprRl(gz, scope, lhs_rl, object_node); // Emit dbg_stmt for the dot token (AstGen.zig:6183-6184). - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); { uint32_t line = ag->source_line - gz->decl_line; uint32_t column = ag->source_column; @@ -3117,7 +3123,7 @@ static uint32_t simpleBinOp( || op_tag == ZIR_INST_MUL || op_tag == ZIR_INST_DIV || op_tag == ZIR_INST_MOD_REM) { if (!gz->is_comptime) { - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); } saved_line = ag->source_line - gz->decl_line; saved_col = ag->source_column; @@ -3138,7 +3144,7 @@ static uint32_t shiftOp( AstData nd = ag->tree->nodes.datas[node]; uint32_t lhs = exprRl(gz, scope, RL_NONE_VAL, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; @@ -3328,7 +3334,7 @@ static Callee calleeExpr( // Advance to main token (the `.` dot) — not first token // (AstGen.zig:10209). - advanceSourceCursorToMainToken(ag, fn_expr_node); + advanceSourceCursorToMainToken(ag, gz, fn_expr_node); { uint32_t line = ag->source_line - gz->decl_line; uint32_t column = ag->source_column; @@ -4079,7 +4085,7 @@ static uint32_t exprRl(GenZir* gz, Scope* scope, ResultLoc rl, uint32_t node) { // unwrap_optional (AstGen.zig:966-985). case AST_NODE_UNWRAP_OPTIONAL: { uint32_t lhs = expr(gz, scope, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; emitDbgStmt(gz, saved_line, saved_col); @@ -4148,23 +4154,26 @@ static uint32_t exprRl(GenZir* gz, Scope* scope, ResultLoc rl, uint32_t node) { case AST_NODE_ARRAY_ACCESS: { if (RL_IS_REF(rl)) { uint32_t lhs = exprRl(gz, scope, RL_REF_VAL, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); + uint32_t saved_line = ag->source_line - gz->decl_line; + uint32_t saved_col = ag->source_column; uint32_t rhs = expr(gz, scope, nd.rhs); - emitDbgStmt( - gz, ag->source_line - gz->decl_line, ag->source_column); + emitDbgStmt(gz, saved_line, saved_col); return addPlNodeBin(gz, ZIR_INST_ELEM_PTR_NODE, node, lhs, rhs); } uint32_t lhs = expr(gz, scope, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); + uint32_t saved_line = ag->source_line - gz->decl_line; + uint32_t saved_col = ag->source_column; uint32_t rhs = expr(gz, scope, nd.rhs); - emitDbgStmt(gz, ag->source_line - gz->decl_line, ag->source_column); + emitDbgStmt(gz, saved_line, saved_col); return rvalue(gz, rl, addPlNodeBin(gz, ZIR_INST_ELEM_VAL_NODE, node, lhs, rhs), node); } // slice (AstGen.zig:882-939). case AST_NODE_SLICE_OPEN: { uint32_t lhs = exprRl(gz, scope, RL_REF_VAL, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t start = expr(gz, scope, nd.rhs); @@ -4176,7 +4185,7 @@ static uint32_t exprRl(GenZir* gz, Scope* scope, ResultLoc rl, uint32_t node) { // Slice[rhs]: { start, end } const Ast* stree = ag->tree; uint32_t lhs = exprRl(gz, scope, RL_REF_VAL, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t start_node = stree->extra_data.arr[nd.rhs]; @@ -4199,7 +4208,7 @@ static uint32_t exprRl(GenZir* gz, Scope* scope, ResultLoc rl, uint32_t node) { // SliceSentinel[rhs]: { start, end, sentinel } const Ast* stree = ag->tree; uint32_t lhs = exprRl(gz, scope, RL_REF_VAL, nd.lhs); - advanceSourceCursorToMainToken(ag, node); + advanceSourceCursorToMainToken(ag, gz, node); uint32_t saved_line = ag->source_line - gz->decl_line; uint32_t saved_col = ag->source_column; uint32_t start_node = stree->extra_data.arr[nd.rhs]; @@ -5935,7 +5944,7 @@ static void assignOp( || op_tag == ZIR_INST_MUL || op_tag == ZIR_INST_DIV || op_tag == ZIR_INST_MOD_REM) { if (!gz->is_comptime) { - advanceSourceCursorToMainToken(ag, infix_node); + advanceSourceCursorToMainToken(ag, gz, infix_node); } cursor_line = ag->source_line - gz->decl_line; cursor_col = ag->source_column; diff --git a/astgen_test.zig b/astgen_test.zig @@ -798,7 +798,7 @@ test "astgen: corpus tokenizer_test.zig" { } test "astgen: corpus astgen_test.zig" { - if (true) return error.SkipZigTest; // TODO: extra_len diff=-377, string_bytes diff=-1 + if (true) return error.SkipZigTest; // TODO: dbg_stmt line/column mismatch at inst 1557 const gpa = std.testing.allocator; try corpusCheck(gpa, @embedFile("astgen_test.zig")); }