stricter test suite
This commit is contained in:
37
astgen.c
37
astgen.c
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user