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>
This commit is contained in:
51
astgen.c
51
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;
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user