authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-09-13 16:41:22+03:30
committergravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2026-09-18 16:36:24+03:30
log65b95b0af42b3da0aaa86c9448e32e8aca388a17
treeb23b76af4f22bf95692d10c858be9f4d41b4fb9f
parentc4c3818c396dc57e1422356f3bb865d99c0c27e8

add unskip_spirv_tests.zig tool


40 files changed, 331 insertions(+), 63 deletions(-)

test/behavior/addrspace_and_linksection.zig+4
......@@ -12,6 +12,8 @@ const var_linksection = linksections.?[1];
1212const fn_linksection = linksections.?[2];
1313
1414test "addrspace on container-level const" {
15 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
16
1517 const S = struct {
1618 const a: u32 addrspace(.generic) = 123;
1719 fn check(ptr: anytype) !void {
......@@ -47,6 +49,8 @@ test "addrspace and linksection on container-level const" {
4749}
4850
4951test "addrspace on container-level var" {
52 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
53
5054 const S = struct {
5155 var a: u32 addrspace(.generic) = 123;
5256 fn check(ptr: anytype) !void {
test/behavior/align.zig+1
......@@ -467,6 +467,7 @@ var default_aligned_global = DefaultAligned{
467467};
468468
469469test "read 128-bit field from default aligned struct in global memory" {
470 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
470471 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
471472 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
472473 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/array.zig+1-1
......@@ -582,6 +582,7 @@ test "array with comptime-only element type" {
582582}
583583
584584test "tuple to array handles sentinel" {
585 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
585586 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
586587 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
587588
......@@ -936,7 +937,6 @@ test "accessing multidimensional global array at comptime" {
936937
937938test "union that needs padding bytes inside an array" {
938939 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
939 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
940940 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
941941 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
942942
test/behavior/basic.zig+6
......@@ -60,6 +60,7 @@ const g1: i32 = 1233 + 1;
6060var g2: i32 = 0;
6161
6262test "global variables" {
63 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
6364 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
6465
6566 try expect(g2 == 0);
......@@ -683,6 +684,7 @@ var gdt = [_]GDTEntry{
683684var global_ptr = &gdt[0];
684685
685686test "global constant is loaded with a runtime-known index" {
687 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
686688 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
687689
688690 const S = struct {
......@@ -999,6 +1001,8 @@ test "generic function uses return type of other generic function" {
9991001}
10001002
10011003test "const alloc with comptime-known initializer is made comptime-known" {
1004 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1005
10021006 const S = struct {
10031007 a: bool,
10041008 b: [2]u8,
......@@ -1079,6 +1083,8 @@ test "inline call of function with a switch inside the return statement" {
10791083}
10801084
10811085test "pointer to zero sized global is mutable" {
1086 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1087
10821088 const S = struct {
10831089 const Thing = struct {};
10841090
test/behavior/bitcast.zig-1
......@@ -110,7 +110,6 @@ test "@bitCast packed structs at runtime and comptime" {
110110 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
111111 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
112112 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
113 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
114113
115114 const Full = packed struct {
116115 number: u16,
test/behavior/call.zig+2
......@@ -538,6 +538,8 @@ test "call function pointer in comptime field" {
538538}
539539
540540test "generic function pointer can be called" {
541 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
542
541543 const S = struct {
542544 var ok = false;
543545 fn foo(x: anytype) void {
test/behavior/comptime_memory.zig+2
......@@ -431,6 +431,8 @@ test "type pun @ptrFromInt" {
431431}
432432
433433test "type pun null pointer-like optional" {
434 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
435
434436 const p: ?*u8 = null;
435437 // note that expectEqual hides the bug
436438 try testing.expect(@as(*const ?*i8, @ptrCast(&p)).* == null);
test/behavior/decl_literals.zig-1
......@@ -35,7 +35,6 @@ test "decl literal with pointer" {
3535test "call decl literal with optional" {
3636 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
3737 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
38 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
3938
4039 const S = struct {
4140 x: u32,
test/behavior/defer.zig+1
......@@ -89,6 +89,7 @@ fn runSomeErrorDefers(x: bool) !bool {
8989}
9090
9191test "mixing normal and error defers" {
92 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
9293 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9394 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9495
test/behavior/enum.zig-1
......@@ -930,7 +930,6 @@ test "constant enum initialization with differing sizes" {
930930 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
931931 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
932932 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
933 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
934933 try test3_1(test3_foo);
935934 try test3_2(test3_bar);
936935}
test/behavior/error.zig+3-1
......@@ -524,7 +524,6 @@ test "function pointer with return type that is error union with payload which i
524524}
525525
526526test "return result loc as peer result loc in inferred error set function" {
527 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
528527 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
529528 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
530529 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -783,6 +782,7 @@ const NoReturn = struct {
783782};
784783
785784test "error union of noreturn used with if" {
785 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
786786 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
787787 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
788788 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -796,6 +796,7 @@ test "error union of noreturn used with if" {
796796}
797797
798798test "error union of noreturn used with try" {
799 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
799800 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
800801 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
801802 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -806,6 +807,7 @@ test "error union of noreturn used with try" {
806807}
807808
808809test "error union of noreturn used with catch" {
810 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
809811 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
810812 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
811813 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
test/behavior/eval.zig+13
......@@ -5,6 +5,8 @@ const expect = std.testing.expect;
55const expectEqual = std.testing.expectEqual;
66
77test "compile time recursion" {
8 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
9
810 try expect(some_data.len == 21);
911}
1012var some_data: [@as(usize, @intCast(fibonacci(7)))]u8 = undefined;
......@@ -388,6 +390,7 @@ test "return 0 from function that has u0 return type" {
388390}
389391
390392test "statically initialized struct" {
393 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
391394 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
392395
393396 st_init_str_foo.x += 1;
......@@ -927,6 +930,7 @@ test "closure capture type of runtime-known var" {
927930}
928931
929932test "comptime break passing through runtime condition converted to runtime break" {
933 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
930934 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
931935
932936 const S = struct {
......@@ -959,6 +963,7 @@ test "comptime break passing through runtime condition converted to runtime brea
959963}
960964
961965test "comptime break to outer loop passing through runtime condition converted to runtime break" {
966 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
962967 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
963968 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
964969
......@@ -1158,6 +1163,8 @@ test "repeated value is correctly expanded" {
11581163}
11591164
11601165test "value in if block is comptime-known" {
1166 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1167
11611168 const first = blk: {
11621169 const s = if (false) "a" else "b";
11631170 break :blk "foo" ++ s;
......@@ -1266,6 +1273,8 @@ test "continue in inline for inside a comptime switch" {
12661273}
12671274
12681275test "length of global array is determinable at comptime" {
1276 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1277
12691278 const S = struct {
12701279 var bytes: [1024]u8 = undefined;
12711280
......@@ -1313,6 +1322,7 @@ test "continue nested inline for loop in named block expr" {
13131322}
13141323
13151324test "x and false is comptime-known false" {
1325 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
13161326 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13171327
13181328 const T = struct {
......@@ -1340,6 +1350,7 @@ test "x and false is comptime-known false" {
13401350}
13411351
13421352test "x or true is comptime-known true" {
1353 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
13431354 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13441355
13451356 const T = struct {
......@@ -1401,6 +1412,8 @@ test "comptime function turns function value to function pointer" {
14011412}
14021413
14031414test "container level const and var have unique addresses" {
1415 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1416
14041417 const S = struct {
14051418 x: i32,
14061419 y: i32,
test/behavior/export_builtin.zig+2
......@@ -4,6 +4,7 @@ const expect = std.testing.expect;
44
55test "exporting enum value" {
66 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
78
89 const S = struct {
910 const E = enum(c_int) { one, two };
......@@ -29,6 +30,7 @@ test "exporting with internal linkage" {
2930
3031test "exporting using namespace access" {
3132 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
33 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
3234
3335 const S = struct {
3436 const Inner = struct {
test/behavior/floatop.zig-7
......@@ -464,7 +464,6 @@ test "@sqrt with vectors" {
464464 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
465465 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
466466 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
467 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
468467
469468 try testSqrtWithVectors();
470469 try comptime testSqrtWithVectors();
......@@ -532,7 +531,6 @@ test "@sin with vectors" {
532531 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
533532 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
534533 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
535 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
536534
537535 try testSinWithVectors();
538536 try comptime testSinWithVectors();
......@@ -600,7 +598,6 @@ test "@cos with vectors" {
600598 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
601599 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
602600 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
603 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
604601
605602 try testCosWithVectors();
606603 try comptime testCosWithVectors();
......@@ -668,7 +665,6 @@ test "@tan with vectors" {
668665 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
669666 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
670667 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
671 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
672668
673669 try testTanWithVectors();
674670 try comptime testTanWithVectors();
......@@ -740,7 +736,6 @@ test "@exp with vectors" {
740736 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
741737 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
742738 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
743 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
744739
745740 try testExpWithVectors();
746741 try comptime testExpWithVectors();
......@@ -807,7 +802,6 @@ test "@exp2 with @vectors" {
807802 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
808803 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
809804 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
810 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
811805
812806 try testExp2WithVectors();
813807 try comptime testExp2WithVectors();
......@@ -939,7 +933,6 @@ test "@log2 with vectors" {
939933 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
940934 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
941935 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
942 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
943936 // https://github.com/ziglang/zig/issues/13681
944937 if (builtin.zig_backend == .stage2_llvm and
945938 builtin.cpu.arch == .aarch64 and
test/behavior/generics.zig+1
......@@ -516,6 +516,7 @@ test "comptime callconv(.c) function ptr uses comptime type argument" {
516516}
517517
518518test "call generic function with from function called by the generic function" {
519 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
519520 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
520521 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
521522 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/globals.zig+2-4
......@@ -4,6 +4,7 @@ const expect = std.testing.expect;
44
55var pos = [2]f32{ 0.0, 0.0 };
66test "store to global array" {
7 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
78 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
89 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
910
......@@ -14,6 +15,7 @@ test "store to global array" {
1415
1516var vpos = @Vector(2, f32){ 0.0, 0.0 };
1617test "store to global vector" {
18 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1719 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
1820 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1921
......@@ -66,8 +68,6 @@ test "global loads can affect liveness" {
6668}
6769
6870test "global const can be self-referential" {
69 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
70
7171 const S = struct {
7272 self: *const @This(),
7373 x: u32,
......@@ -112,8 +112,6 @@ test "global var can be self-referential" {
112112}
113113
114114test "global const can be indirectly self-referential" {
115 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
116
117115 const S = struct {
118116 other: *const @This(),
119117 x: u32,
test/behavior/if.zig+1
......@@ -44,6 +44,7 @@ var global_with_val: anyerror!u32 = 0;
4444var global_with_err: anyerror!u32 = error.SomeError;
4545
4646test "unwrap mutable global var" {
47 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
4748 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
4849
4950 if (global_with_val) |v| {
test/behavior/inline_switch.zig-2
......@@ -4,7 +4,6 @@ const builtin = @import("builtin");
44
55test "inline scalar prongs" {
66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
87
98 var x: usize = 0;
109 switch (x) {
......@@ -19,7 +18,6 @@ test "inline scalar prongs" {
1918
2019test "inline prong ranges" {
2120 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
22 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
2321
2422 var x: usize = 0;
2523 _ = &x;
test/behavior/ir_block_deps.zig-1
......@@ -19,7 +19,6 @@ fn getErrInt() anyerror!i32 {
1919
2020test "ir block deps" {
2121 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
22 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
2322 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2423
2524 try expect((foo(1) catch unreachable) == 0);
test/behavior/math.zig+1
......@@ -2570,6 +2570,7 @@ test "partially-runtime integer vector division would be illegal if vector eleme
25702570 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25712571 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25722572 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
2573 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
25732574 if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .hexagon) return error.SkipZigTest;
25742575
25752576 var lhs: @Vector(2, i8) = .{ -128, 5 };
test/behavior/null.zig+1
......@@ -183,6 +183,7 @@ const SillyStruct = struct {
183183const here_is_a_null_literal = SillyStruct{ .context = null };
184184
185185test "unwrap optional which is field of global var" {
186 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
186187 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
187188 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
188189
test/behavior/optional.zig+2-4
......@@ -319,7 +319,6 @@ test "assigning to an unwrapped optional field in an inline loop" {
319319test "coerce an anon struct literal to optional struct" {
320320 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
321321 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
322 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
323322
324323 const S = struct {
325324 const Struct = struct {
......@@ -388,7 +387,6 @@ test "0-bit child type coerced to optional" {
388387test "array of optional unaligned types" {
389388 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
390389 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
391 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
392390
393391 const Enum = enum { one, two, three };
394392
......@@ -477,6 +475,7 @@ const NoReturn = struct {
477475};
478476
479477test "optional of noreturn used with if" {
478 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
480479 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
481480
482481 NoReturn.a = 64;
......@@ -488,6 +487,7 @@ test "optional of noreturn used with if" {
488487}
489488
490489test "optional of noreturn used with orelse" {
490 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
491491 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
492492
493493 NoReturn.a = 64;
......@@ -652,8 +652,6 @@ test "result location initialization of optional with OPV payload" {
652652}
653653
654654test "global comptime only optional" {
655 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
656
657655 const S = struct {
658656 const @"null": ?*type = null;
659657 const @"void": ?*const type = &void;
test/behavior/packed-struct.zig-9
......@@ -794,7 +794,6 @@ test "nested packed struct at non-zero offset 2" {
794794test "runtime init of unnamed packed struct type" {
795795 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
796796 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
797 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
798797
799798 var z: u8 = 123;
800799 _ = &z;
......@@ -889,7 +888,6 @@ test "store undefined to packed result location" {
889888 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
890889 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
891890 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
892 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
893891
894892 var x: u4 = 0;
895893 _ = &x;
......@@ -910,7 +908,6 @@ test "bitcast back and forth" {
910908// Originally reported at https://github.com/ziglang/zig/issues/14200
911909test "field access of packed struct smaller than its abi size inside struct initialized with rls" {
912910 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
913 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
914911 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
915912
916913 const S = struct {
......@@ -1006,7 +1003,6 @@ test "packed struct acts as a namespace" {
10061003test "assignment to non-byte-aligned field in packed struct" {
10071004 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
10081005 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1009 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
10101006 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
10111007
10121008 const Frame = packed struct {
......@@ -1046,7 +1042,6 @@ test "load flag from packed struct in union" {
10461042 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
10471043 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10481044 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1049 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
10501045 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
10511046
10521047 const A = packed struct {
......@@ -1168,7 +1163,6 @@ test "packed struct equality" {
11681163
11691164test "packed struct equality ignores padding bits" {
11701165 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1171 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
11721166
11731167 const S = packed struct { b: bool };
11741168 var s: S = undefined;
......@@ -1178,7 +1172,6 @@ test "packed struct equality ignores padding bits" {
11781172}
11791173
11801174test "packed struct with signed field" {
1181 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
11821175 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11831176
11841177 var s: packed struct {
......@@ -1193,7 +1186,6 @@ test "packed struct with signed field" {
11931186test "assign packed struct initialized with RLS to packed struct literal field" {
11941187 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11951188 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1196 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
11971189
11981190 const Inner = packed struct { x: u17 };
11991191 const Outer = packed struct { inner: Inner, x: u15 };
......@@ -1209,7 +1201,6 @@ test "assign packed struct initialized with RLS to packed struct literal field"
12091201
12101202test "packed struct store of comparison result" {
12111203 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1212 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
12131204 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
12141205
12151206 const S1 = packed struct {
test/behavior/pointers.zig+2
......@@ -642,6 +642,8 @@ test "result type preserved through multiple references" {
642642}
643643
644644test "result type found through optional pointer" {
645 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
646
645647 const ptr1: ?*const u32 = &@intCast(123);
646648 const ptr2: ?[]const u8 = &.{ @intCast(123), @truncate(0xABCD) };
647649 try expect(ptr1.?.* == 123);
test/behavior/shuffle.zig-1
......@@ -176,7 +176,6 @@ test "@shuffle u0" {
176176 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
177177 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
178178 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
179 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
180179
181180 const S = struct {
182181 fn doTheTest() !void {
test/behavior/sizeof_and_typeof.zig+1
......@@ -134,6 +134,7 @@ test "@TypeOf() has no runtime side effects" {
134134}
135135
136136test "branching logic inside @TypeOf" {
137 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
137138 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
138139
139140 const S = struct {
test/behavior/slice.zig+1-2
......@@ -254,8 +254,6 @@ test "slicing pointer by length" {
254254const x = @as([*]i32, @ptrFromInt(0x1000))[0..0x500];
255255const y = x[0x100..];
256256test "compile time slice of pointer to hard coded address" {
257 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
258
259257 try expect(@intFromPtr(x) == 0x1000);
260258 try expect(x.len == 0x500);
261259
......@@ -858,6 +856,7 @@ test "slice len modification at comptime" {
858856}
859857
860858test "slice field ptr const" {
859 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
861860 const const_slice: []const u8 = "string";
862861
863862 const const_ptr_const_slice = &const_slice;
test/behavior/splat.zig+1
......@@ -92,6 +92,7 @@ test "splat with an error union or optional result type" {
9292}
9393
9494test "read/write through global variable array of struct fields initialized via splat" {
95 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
9596 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9697 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9798
test/behavior/struct.zig+5-2
......@@ -443,6 +443,7 @@ test "packed struct 24bits" {
443443}
444444
445445test "runtime struct initialization of bitfield" {
446 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
446447 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
447448 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
448449 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -714,6 +715,7 @@ test "packed struct with u0 field access" {
714715}
715716
716717test "access to global struct fields" {
718 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
717719 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
718720
719721 g_foo.bar.value = 42;
......@@ -943,7 +945,6 @@ test "tuple element initialized with fn call" {
943945}
944946
945947test "struct with union field" {
946 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
947948 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
948949 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
949950
......@@ -1081,7 +1082,6 @@ test "anon init through error unions and optionals" {
10811082test "anon init through optional" {
10821083 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10831084 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1084 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
10851085
10861086 const S = struct {
10871087 a: u32,
......@@ -1760,6 +1760,8 @@ test "circular dependency through pointer field of a struct" {
17601760}
17611761
17621762test "field calls do not force struct field init resolution" {
1763 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1764
17631765 const S = struct {
17641766 x: u32 = blk: {
17651767 _ = @TypeOf(make().dummyFn()); // runtime field call - S not fully resolved - dummyFn call should not force field init resolution
......@@ -1985,6 +1987,7 @@ test "assignment of field with padding" {
19851987}
19861988
19871989test "initiate global variable with runtime value" {
1990 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
19881991 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
19891992 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
19901993
test/behavior/switch.zig+1-10
......@@ -252,6 +252,7 @@ fn poll() void {
252252}
253253
254254test "switch on global mutable var isn't constant-folded" {
255 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
255256 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
256257
257258 while (state < 2) {
......@@ -270,7 +271,6 @@ test "switch prong with variable" {
270271 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
271272 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
272273 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
273 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
274274
275275 try switchProngWithVarFn(SwitchProngWithVarEnum{ .One = 13 });
276276 try switchProngWithVarFn(SwitchProngWithVarEnum{ .Two = 13.0 });
......@@ -294,7 +294,6 @@ fn switchProngWithVarFn(a: SwitchProngWithVarEnum) !void {
294294test "switch on enum using pointer capture" {
295295 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
296296 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
297 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
298297
299298 try testSwitchEnumPtrCapture();
300299 try comptime testSwitchEnumPtrCapture();
......@@ -570,7 +569,6 @@ test "switch with null and T peer types and inferred result location type" {
570569test "switch prongs with cases with identical payload types" {
571570 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
572571 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
573 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
574572
575573 const Union = union(enum) {
576574 A: usize,
......@@ -726,7 +724,6 @@ test "switch on error set with single else" {
726724test "switch capture copies its payload" {
727725 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
728726 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
729 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
730727
731728 const S = struct {
732729 fn doTheTest() !void {
......@@ -788,7 +785,6 @@ test "enum value without tag name used as switch item" {
788785}
789786
790787test "switch item sizeof" {
791 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
792788 const S = struct {
793789 fn doTheTest() !void {
794790 var a: usize = 0;
......@@ -817,8 +813,6 @@ test "comptime inline switch" {
817813}
818814
819815test "switch capture peer type resolution" {
820 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
821
822816 const U = union(enum) {
823817 a: u32,
824818 b: u64,
......@@ -835,7 +829,6 @@ test "switch capture peer type resolution" {
835829
836830test "switch capture peer type resolution for in-memory coercible payloads" {
837831 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
838 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
839832
840833 const T1 = c_int;
841834 const t1_info = @typeInfo(T1).int;
......@@ -1166,8 +1159,6 @@ test "switch with uninstantiable union fields" {
11661159}
11671160
11681161test "switch with tag capture" {
1169 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1170
11711162 const U = union(enum) {
11721163 a,
11731164 b: i32,
test/behavior/switch_loop.zig-2
......@@ -96,7 +96,6 @@ test "switch loop on tagged union" {
9696 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9797 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9898 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
99 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; // TODO
10099 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
101100
102101 const S = struct {
......@@ -291,7 +290,6 @@ test "switch loop with discarded tag capture" {
291290}
292291
293292test "switch loop with single catch-all prong" {
294 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
295293 const S = struct {
296294 const E = enum { a, b, c };
297295 const U = union(E) { a: u32, b: u16, c: u8 };
test/behavior/switch_prong_implicit_cast.zig-1
......@@ -18,7 +18,6 @@ test "switch prong implicit cast" {
1818 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1919 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2020 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
21 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
2221
2322 const result = switch (foo(2) catch unreachable) {
2423 FormValue.One => false,
test/behavior/threadlocal.zig-1
......@@ -6,7 +6,6 @@ test "thread local variable" {
66 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
109 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
1110
1211 const S = struct {
test/behavior/tuple.zig+2
......@@ -548,6 +548,8 @@ test "OPV tuple fields aren't comptime" {
548548}
549549
550550test "array of tuples that end with a zero-bit field followed by padding" {
551 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
552
551553 const S = struct {
552554 var foo: [2]struct { u32, u8, void } = .{ .{ 1, 2, {} }, .{ 3, 4, {} } };
553555 };
test/behavior/type.zig+2
......@@ -406,6 +406,8 @@ test "matching captures causes opaque equivalence" {
406406}
407407
408408test "reify enum where fields refers to part of array" {
409 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
410
409411 const field_names: [3][]const u8 = .{ "foo", "bar", undefined };
410412 const field_values: [3]u8 = .{ undefined, 0, 1 };
411413 const E = @Enum(u8, .exhaustive, field_names[0..2], field_values[1..3]);
test/behavior/union.zig+3-11
......@@ -442,6 +442,7 @@ const Foo1 = union(enum) {
442442var glbl: Foo1 = undefined;
443443
444444test "global union with single field is correctly initialized" {
445 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
445446 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
446447 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
447448
......@@ -551,7 +552,6 @@ const Baz = enum { A, B, C, D };
551552
552553test "tagged union type" {
553554 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
554 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
555555
556556 const foo1 = TaggedFoo{ .One = 13 };
557557 const foo2 = TaggedFoo{
......@@ -576,7 +576,6 @@ test "tagged union as return value" {
576576 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
577577 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
578578 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
579 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
580579
581580 switch (returnAnInt(13)) {
582581 TaggedFoo.One => |value| try expect(value == 13),
......@@ -619,7 +618,6 @@ test "union(enum(u32)) with specified and unspecified tag values" {
619618 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
620619 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
621620 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
622 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
623621
624622 comptime assert(Tag(Tag(MultipleChoice2)) == u32);
625623 try testEnumWithSpecifiedAndUnspecifiedTagValues(MultipleChoice2{ .C = 123 });
......@@ -709,7 +707,6 @@ test "union with only 1 field casted to its enum type which has enum value speci
709707test "@intFromEnum works on unions" {
710708 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
711709 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
712 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
713710
714711 const Bar = union(enum) {
715712 A: bool,
......@@ -793,7 +790,6 @@ test "@unionInit stored to a const" {
793790 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
794791 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
795792 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
796 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
797793
798794 const S = struct {
799795 const U = union(enum) {
......@@ -823,7 +819,6 @@ test "@unionInit stored to a const" {
823819test "@unionInit can modify a union type" {
824820 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
825821 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
826 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
827822
828823 const UnionInitEnum = union(enum) {
829824 Boolean: bool,
......@@ -846,7 +841,6 @@ test "@unionInit can modify a union type" {
846841test "@unionInit can modify a pointer value" {
847842 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
848843 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
849 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
850844
851845 const UnionInitEnum = union(enum) {
852846 Boolean: bool,
......@@ -954,7 +948,6 @@ test "function call result coerces from tagged union to the tag" {
954948test "switching on non exhaustive union" {
955949 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
956950 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
957 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
958951
959952 const S = struct {
960953 const E = enum(u8) {
......@@ -1256,7 +1249,6 @@ test "@unionInit uses tag value instead of field index" {
12561249 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12571250 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
12581251 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1259 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
12601252 const E = enum(u8) {
12611253 b = 255,
12621254 a = 3,
......@@ -1414,6 +1406,8 @@ test "reinterpreting enum value inside packed union" {
14141406}
14151407
14161408test "access the tag of a global tagged union" {
1409 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1410
14171411 const U = union(enum) {
14181412 a,
14191413 b: u8,
......@@ -2005,7 +1999,6 @@ test "circular dependency through pointer field of a union" {
20051999
20062000test "pass nested union with rls" {
20072001 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
2008 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
20092002
20102003 const Union = union(enum) {
20112004 a: u32,
......@@ -2052,7 +2045,6 @@ test "runtime union init, most-aligned field != largest" {
20522045test "copied union field doesn't alias source" {
20532046 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
20542047 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2055 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
20562048
20572049 const U = union(enum) {
20582050 array: [10]u32,
test/behavior/vector.zig-1
......@@ -378,7 +378,6 @@ test "array of non-abi-sized integer to vector of same type" {
378378 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
379379 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
380380 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
381 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
382381
383382 const S = struct {
384383 fn doTheTest() !void {
test/behavior/while.zig+5
......@@ -122,6 +122,8 @@ test "while copies its payload" {
122122}
123123
124124test "continue and break" {
125 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
126
125127 try runContinueAndBreakTest();
126128 try expect(continue_and_break_counter == 8);
127129}
......@@ -140,6 +142,7 @@ fn runContinueAndBreakTest() !void {
140142}
141143
142144test "while with optional as condition" {
145 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
143146 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
144147 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
145148 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -153,6 +156,7 @@ test "while with optional as condition" {
153156}
154157
155158test "while with optional as condition with else" {
159 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
156160 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
157161 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
158162 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -171,6 +175,7 @@ test "while with optional as condition with else" {
171175}
172176
173177test "while with error union condition" {
178 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
174179 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
175180 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
176181
test/standalone/build.zig+1
......@@ -44,6 +44,7 @@ pub fn build(b: *std.Build) void {
4444 "../../tools/generate_linux_syscalls.zig",
4545 "../../tools/process_headers.zig",
4646 "../../tools/migrate_langref.zig",
47 "../../tools/unskip_spirv_tests.zig",
4748 "../../tools/update-linux-headers.zig",
4849 "../../tools/update_clang_options.zig",
4950 "../../tools/update_cpu_features.zig",
tools/unskip_spirv_tests.zig created+264
......@@ -0,0 +1,264 @@
1const std = @import("std");
2const Io = std.Io;
3const Allocator = std.mem.Allocator;
4const Ast = std.zig.Ast;
5
6const usage =
7 \\Usage: unskip_spirv_tests <zig> <test_runner> <test_cmd> [test/behavior/*.zig ...]
8 \\
9 \\For example:
10 \\zig run tools/unskip_spirv_tests.zig -- zig-out/bin/zig \
11 \\ ../zig-spirv-test-executor/src/test_runner.zig \
12 \\ ../zig-spirv-test-executor/zig-out/bin/zig-spirv-test-executor [files...]
13 \\
14 \\Runs every behavior test that is skipped on stage2_spirv in isolation and
15 \\removes the skip if the test passes.
16 \\
17;
18
19const Test = struct {
20 body: Ast.Node.Index,
21 name: []const u8,
22 skip: ?Ast.Node.Index,
23};
24
25pub fn main(init: std.process.Init) !void {
26 const io = init.io;
27 const arena = init.arena.allocator();
28
29 var args = try init.minimal.args.iterateAllocator(arena);
30 _ = args.skip();
31 const zig = args.next() orelse std.process.fatal(usage, .{});
32 const test_runner = args.next() orelse std.process.fatal(usage, .{});
33 const test_cmd = args.next() orelse std.process.fatal(usage, .{});
34
35 var files: std.ArrayList([]const u8) = .empty;
36 while (args.next()) |path| try files.append(arena, path);
37
38 if (files.items.len == 0) {
39 var dir = try Io.Dir.openDir(.cwd(), io, "test/behavior", .{ .iterate = true });
40 defer dir.close(io);
41
42 var it = dir.iterate();
43 while (try it.next(io)) |entry| {
44 if (entry.kind != .file or !std.mem.endsWith(u8, entry.name, ".zig")) continue;
45 const path = try std.fs.path.join(arena, &.{ "test/behavior", entry.name });
46 const source = try Io.Dir.readFileAlloc(.cwd(), io, path, arena, .unlimited);
47 if (std.mem.find(u8, source, "stage2_spirv") != null) {
48 try files.append(arena, path);
49 }
50 }
51 }
52
53 var stdout_buffer: [4096]u8 = undefined;
54 var stdout_writer = Io.File.stdout().writer(io, &stdout_buffer);
55 const stdout = &stdout_writer.interface;
56
57 const progress = std.Progress.start(io, .{ .estimated_total_items = files.items.len });
58 const cache_dir = init.environ_map.get("ZIG_LOCAL_CACHE_DIR") orelse ".zig-cache";
59 const variant_dir = try std.fs.path.join(arena, &.{ cache_dir, "unskip" });
60 try Io.Dir.createDirPath(.cwd(), io, variant_dir);
61
62 var failures: std.array_hash_map.String(std.ArrayList([]const u8)) = .empty;
63 var total_removed: usize = 0;
64 var files_changed: usize = 0;
65 for (files.items) |path| {
66 const basename = std.fs.path.basename(path);
67 const source = try Io.Dir.readFileAlloc(.cwd(), io, path, arena, .unlimited);
68 const ast = try Ast.parse(arena, try arena.dupeSentinel(u8, source, 0), .{});
69 if (ast.errors.len != 0) std.process.fatal("{s}: parse error", .{path});
70
71 var tests: std.ArrayList(Test) = .empty;
72 var skips: usize = 0;
73 for (ast.rootDecls()) |decl| {
74 if (ast.nodeTag(decl) != .test_decl) continue;
75 const name_token, const body = ast.nodeData(decl).opt_token_and_node;
76 const token = name_token.unwrap() orelse continue;
77 const name = if (ast.tokenTag(token) == .string_literal)
78 try std.zig.string_literal.parseAlloc(arena, ast.tokenSlice(token))
79 else
80 ast.tokenSlice(token);
81
82 var buffer: [2]Ast.Node.Index = undefined;
83 const skip: ?Ast.Node.Index = for (ast.blockStatements(&buffer, body) orelse &.{}) |statement| {
84 const if_full = ast.fullIf(statement) orelse continue;
85 if (ast.nodeTag(if_full.ast.cond_expr) != .equal_equal) continue;
86 _, const rhs = ast.nodeData(if_full.ast.cond_expr).node_and_node;
87 if (!std.mem.eql(u8, ast.getNodeSource(rhs), ".stage2_spirv")) continue;
88 if (ast.nodeTag(if_full.ast.then_expr) != .@"return") continue;
89 const value = ast.nodeData(if_full.ast.then_expr).opt_node.unwrap() orelse continue;
90 if (!std.mem.eql(u8, ast.getNodeSource(value), "error.SkipZigTest")) continue;
91 break statement;
92 } else null;
93 skips += @intFromBool(skip != null);
94
95 try tests.append(arena, .{ .body = body, .name = name, .skip = skip });
96 }
97
98 if (skips == 0) {
99 progress.completeOne();
100 continue;
101 }
102
103 const file_node = progress.start(basename, skips);
104 defer file_node.end();
105 const variant_path = try std.fs.path.join(arena, &.{ variant_dir, basename });
106
107 var removed: Ast.Render.Fixups = .{};
108 for (tests.items) |candidate| {
109 const skip = candidate.skip orelse continue;
110 const test_node = file_node.start(candidate.name, 0);
111 defer test_node.end();
112
113 var fixups: Ast.Render.Fixups = .{};
114 try fixups.omit_nodes.put(arena, skip, {});
115 for (tests.items) |other| {
116 if (other.body == candidate.body) continue;
117 try fixups.replace_nodes_with_string.put(arena, other.body, "{ return error.SkipZigTest; }");
118 }
119
120 var variant: Io.Writer.Allocating = .init(arena);
121 try ast.render(arena, &variant.writer, fixups);
122 try Io.Dir.writeFile(.cwd(), io, .{ .sub_path = variant_path, .data = variant.written() });
123
124 const signature: []const u8 = signature: {
125 const result = std.process.run(arena, io, .{
126 .argv = &.{
127 zig, "test", variant_path,
128 "--test-runner", test_runner, "-target",
129 "spirv64-vulkan", "-mcpu", "vulkan_v1_2+variable_pointers+int64",
130 "-fno-llvm", "--zig-lib-dir", "lib",
131 "--test-cmd", test_cmd, "--test-cmd-bin",
132 },
133 .timeout = .{ .duration = .{ .raw = .fromSeconds(120), .clock = .awake } },
134 .progress_node = test_node,
135 }) catch |err| switch (err) {
136 error.Timeout => break :signature "timeout",
137 else => |e| return e,
138 };
139
140 if (result.term.success()) {
141 try removed.omit_nodes.put(arena, skip, {});
142 std.debug.print("{s}: removed skip for {s}\n", .{ basename, candidate.name });
143 continue;
144 }
145
146 const output = try std.mem.concat(arena, u8, &.{ result.stdout, result.stderr });
147 var lines = std.mem.splitScalar(u8, output, '\n');
148 while (lines.next()) |line| {
149 const rest = std.mem.cutPrefix(u8, line, "error: line ") orelse continue;
150 const colon = std.mem.findScalar(u8, rest, ':') orelse continue;
151 if (!allDigits(rest[0..colon])) continue;
152 break :signature try normalize(arena, "spirv-val: ", rest[colon + 1 ..]);
153 }
154 lines.reset();
155
156 while (lines.next()) |line| {
157 const rest = std.mem.cutPrefix(u8, line, "thread ") orelse continue;
158 const panic = std.mem.find(u8, rest, " panic: ") orelse continue;
159 if (std.mem.findScalar(u8, rest[0..panic], ' ') != null) continue;
160 break :signature try normalize(arena, "panic: ", rest[panic + " panic: ".len ..]);
161 }
162 lines.reset();
163
164 while (lines.next()) |line| {
165 const marker = std.mem.find(u8, line, ": error: ") orelse continue;
166 const location = line[0..marker];
167 const line_colon = std.mem.findScalarLast(u8, location, ':') orelse continue;
168 const file_colon = std.mem.findScalarLast(u8, location[0..line_colon], ':') orelse continue;
169 if (std.mem.findScalar(u8, location[0..file_colon], ' ') != null) continue;
170 if (!allDigits(location[file_colon + 1 .. line_colon])) continue;
171 if (!allDigits(location[line_colon + 1 ..])) continue;
172 const message = line[marker + ": error: ".len ..];
173 break :signature try normalize(arena, "compile error: ", message);
174 }
175 lines.reset();
176
177 while (lines.next()) |line| {
178 const rest = std.mem.cutPrefix(u8, line, "error: ") orelse continue;
179 break :signature try normalize(arena, "error: ", rest);
180 }
181
182 if (std.mem.trim(u8, output, &std.ascii.whitespace).len > 0) {
183 break :signature "unknown failure (no error: line found)";
184 }
185 break :signature "no output";
186 };
187
188 const gop = try failures.getOrPut(arena, signature);
189 if (!gop.found_existing) gop.value_ptr.* = .empty;
190 const failed_test = try std.fmt.allocPrint(arena, "{s} :: {s}", .{ basename, candidate.name });
191 try gop.value_ptr.append(arena, failed_test);
192 }
193
194 std.debug.print("{s}: {d}/{d} skips removed\n", .{ basename, removed.omit_nodes.count(), skips });
195 Io.Dir.deleteFile(.cwd(), io, variant_path) catch {};
196 if (removed.omit_nodes.count() == 0) continue;
197
198 var final: Io.Writer.Allocating = .init(arena);
199 try ast.render(arena, &final.writer, removed);
200 const rendered = try Ast.parse(arena, try arena.dupeSentinel(u8, final.written(), 0), .{});
201 const formatted = try rendered.renderAlloc(arena);
202 try Io.Dir.writeFile(.cwd(), io, .{ .sub_path = path, .data = formatted });
203 total_removed += removed.omit_nodes.count();
204 files_changed += 1;
205 }
206
207 progress.end();
208
209 try stdout.print("\nDone: removed {d} spirv skips across {d} files\n", .{ total_removed, files_changed });
210 if (failures.count() > 0) {
211 var total_failures: usize = 0;
212 for (failures.values()) |failed_tests| total_failures += failed_tests.items.len;
213 try stdout.print("\nMost common blockers ({d} failing attempts, {d} unique signatures):\n", .{
214 total_failures,
215 failures.count(),
216 });
217
218 const Ctx = struct {
219 failed_tests: []const std.ArrayList([]const u8),
220
221 pub fn lessThan(ctx: @This(), a: usize, b: usize) bool {
222 return ctx.failed_tests[a].items.len > ctx.failed_tests[b].items.len;
223 }
224 };
225 failures.sort(Ctx{ .failed_tests = failures.values() });
226
227 for (failures.keys()[0..@min(failures.count(), 30)], failures.values()) |signature, failed_tests| {
228 const count = failed_tests.items.len;
229 const percent = @as(f64, @floatFromInt(count)) * 100 / @as(f64, @floatFromInt(total_failures));
230 try stdout.print("{d:4} ({d:5.1}%) {s}\n", .{ count, percent, signature });
231 for (failed_tests.items) |failed_test| try stdout.print(" {s}\n", .{failed_test});
232 }
233 }
234 try stdout.flush();
235}
236
237fn allDigits(text: []const u8) bool {
238 if (text.len == 0) return false;
239 for (text) |c| if (!std.ascii.isDigit(c)) return false;
240 return true;
241}
242
243fn normalize(arena: Allocator, prefix: []const u8, message: []const u8) ![]u8 {
244 const source = try arena.dupeSentinel(u8, std.mem.trim(u8, message, &std.ascii.whitespace), 0);
245 var out: std.ArrayList(u8) = .empty;
246 try out.appendSlice(arena, prefix);
247 var tokenizer: std.zig.Tokenizer = .init(source);
248 var end: usize = 0;
249 while (true) {
250 const token = tokenizer.next();
251 if (token.tag == .eof) break;
252 try out.appendSlice(arena, source[end..token.loc.start]);
253 end = token.loc.end;
254 const text = source[token.loc.start..token.loc.end];
255 try out.appendSlice(arena, switch (token.tag) {
256 .number_literal => "<n>",
257 .char_literal, .string_literal => "<str>",
258 .identifier => if (token.loc.start > 0 and source[token.loc.start - 1] == '%') "<id>" else text,
259 else => text,
260 });
261 }
262 try out.appendSlice(arena, source[end..]);
263 return out.items[0..@min(out.items.len, prefix.len + 200)];
264}