stricter test suite

This commit is contained in:
2026-02-12 15:42:38 +02:00
parent 4fc156d637
commit 78298a6bb0
2 changed files with 31 additions and 33 deletions

View File

@@ -3130,22 +3130,21 @@ static uint32_t exprRl(GenZir* gz, Scope* scope, ResultLoc rl, uint32_t node) {
ZirInstData rdata;
rdata.un_node.operand
= block_inst + ZIR_REF_START_INDEX;
rdata.un_node.src_node = (int32_t)node
- (int32_t)gz->decl_node_index;
rdata.un_node.src_node
= (int32_t)node - (int32_t)gz->decl_node_index;
addInstruction(gz,
ZIR_INST_RESTORE_ERR_RET_INDEX_UNCONDITIONAL,
rdata);
}
addBreak(gz, break_tag, block_inst,
ZIR_REF_VOID_VALUE, AST_NODE_OFFSET_NONE);
addBreak(gz, break_tag, block_inst, ZIR_REF_VOID_VALUE,
AST_NODE_OFFSET_NONE);
} else {
// Value break (AstGen.zig:2208-2228).
uint32_t operand = exprRl(gz, scope,
block_gz->break_result_info, opt_rhs);
uint32_t operand = exprRl(
gz, scope, block_gz->break_result_info, opt_rhs);
if (!block_gz->is_comptime)
restoreErrRetIndex(gz, block_inst,
block_gz->break_result_info, opt_rhs,
operand);
block_gz->break_result_info, opt_rhs, operand);
switch (block_gz->break_result_info.tag) {
case RL_PTR:
case RL_DISCARD:
@@ -3445,8 +3444,8 @@ static uint32_t blockExprExpr(
gz, block_scope.break_result_info, ZIR_REF_VOID_VALUE, node);
ZirInstTag break_tag
= force_comptime ? ZIR_INST_BREAK_INLINE : ZIR_INST_BREAK;
addBreak(&block_scope, break_tag, block_inst, result,
AST_NODE_OFFSET_NONE);
addBreak(
&block_scope, break_tag, block_inst, result, AST_NODE_OFFSET_NONE);
}
if (force_comptime) {
@@ -4303,12 +4302,15 @@ static uint32_t switchExpr(
pay[pay_len++] = 1;
prong_info_slot = pay_len++;
AstData rng = tree->nodes.datas[cd.lhs];
pay[pay_len++] = comptimeExpr(gz, scope, rng.lhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(gz, scope, rng.rhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(
gz, scope, rng.lhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(
gz, scope, rng.rhs, COMPTIME_REASON_SWITCH_ITEM);
} else {
// Scalar: [item_ref, prong_info, body...]
pay[scalar_tbl + scalar_ci++] = hdr;
pay[pay_len++] = comptimeExpr(gz, scope, cd.lhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(
gz, scope, cd.lhs, COMPTIME_REASON_SWITCH_ITEM);
prong_info_slot = pay_len++;
}
break;
@@ -4340,7 +4342,8 @@ static uint32_t switchExpr(
abort();
pay = p;
}
pay[pay_len++] = comptimeExpr(gz, scope, item, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(
gz, scope, item, COMPTIME_REASON_SWITCH_ITEM);
}
}
// Range pairs.
@@ -4355,8 +4358,10 @@ static uint32_t switchExpr(
abort();
pay = p;
}
pay[pay_len++] = comptimeExpr(gz, scope, rng.lhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(gz, scope, rng.rhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(
gz, scope, rng.lhs, COMPTIME_REASON_SWITCH_ITEM);
pay[pay_len++] = comptimeExpr(
gz, scope, rng.rhs, COMPTIME_REASON_SWITCH_ITEM);
}
}
break;

View File

@@ -576,7 +576,8 @@ fn expectEqualData(
r.bit_count != g.bit_count)
{
std.debug.print(
"inst_datas[{d}] (int_type) mismatch\n", .{idx},
"inst_datas[{d}] (int_type) mismatch\n",
.{idx},
);
return error.TestExpectedEqual;
}
@@ -769,12 +770,11 @@ const corpus_files = .{
.{ "tokenizer_test.zig", @embedFile("tokenizer_test.zig") },
};
/// Returns .pass or .skip for a single corpus entry.
fn corpusCheck(gpa: Allocator, name: []const u8, source: [:0]const u8) enum { pass, skip } {
var tree = Ast.parse(gpa, source, .zig) catch return .skip;
fn corpusCheck(gpa: Allocator, name: []const u8, source: [:0]const u8) !void {
var tree = try Ast.parse(gpa, source, .zig);
defer tree.deinit(gpa);
var ref_zir = AstGen.generate(gpa, tree) catch return .skip;
var ref_zir = try AstGen.generate(gpa, tree);
defer ref_zir.deinit(gpa);
var c_ast = c.astParse(source.ptr, @intCast(source.len));
@@ -784,29 +784,22 @@ fn corpusCheck(gpa: Allocator, name: []const u8, source: [:0]const u8) enum { pa
if (c_zir.has_compile_errors) {
std.debug.print(" {s} -> has_compile_errors\n", .{name});
return .skip;
return error.ZirCompileErrors;
}
if (zirMatches(gpa, ref_zir, c_zir)) {
return .pass;
return;
} else {
std.debug.print(" {s} -> zir mismatch\n", .{name});
return .skip;
return error.ZirMismatch;
}
}
test "astgen: corpus" {
if (true) return error.SkipZigTest;
const gpa = std.testing.allocator;
var passed: u32 = 0;
var skipped: u32 = 0;
inline for (corpus_files) |entry| {
switch (corpusCheck(gpa, entry[0], entry[1])) {
.pass => passed += 1,
.skip => skipped += 1,
}
try corpusCheck(gpa, entry[0], entry[1]);
}
if (passed != corpus_files.len) return error.SkipZigTest;
}