authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-06-25 14:59:22+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-25 21:16:51+02:00
log960c14206094484cee056b8806b9b8f75a84891d
tree0315d9420a504b2337b94c564ae029b20ddeec31
parent76b28ed45238fff843e04e94657e2790ee95954b

stage2 ARM: implement basic intCast and error union wrapping


31 files changed, 53 insertions(+), 113 deletions(-)

src/arch/arm/CodeGen.zig+53-13
......@@ -1002,18 +1002,35 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {
10021002 if (self.liveness.isUnused(inst))
10031003 return self.finishAir(inst, .dead, .{ ty_op.operand, .none, .none });
10041004
1005 const operand_ty = self.air.typeOf(ty_op.operand);
10061005 const operand = try self.resolveInst(ty_op.operand);
1006 const operand_ty = self.air.typeOf(ty_op.operand);
1007 const dest_ty = self.air.typeOfIndex(inst);
1008
1009 const operand_abi_size = operand_ty.abiSize(self.target.*);
1010 const dest_abi_size = dest_ty.abiSize(self.target.*);
10071011 const info_a = operand_ty.intInfo(self.target.*);
1008 const info_b = self.air.typeOfIndex(inst).intInfo(self.target.*);
1009 if (info_a.signedness != info_b.signedness)
1010 return self.fail("TODO gen intcast sign safety in semantic analysis", .{});
1012 const info_b = dest_ty.intInfo(self.target.*);
1013
1014 const dst_mcv: MCValue = blk: {
1015 if (info_a.bits == info_b.bits) {
1016 break :blk operand;
1017 }
1018 if (operand_abi_size > 4 or dest_abi_size > 4) {
1019 return self.fail("TODO implement intCast for abi sizes larger than 4", .{});
1020 }
1021
1022 const operand_lock: ?RegisterLock = switch (operand) {
1023 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
1024 else => null,
1025 };
1026 defer if (operand_lock) |lock| self.register_manager.unlockReg(lock);
10111027
1012 if (info_a.bits == info_b.bits)
1013 return self.finishAir(inst, operand, .{ ty_op.operand, .none, .none });
1028 const reg = try self.register_manager.allocReg(inst, gp);
1029 try self.genSetReg(dest_ty, reg, operand);
1030 break :blk MCValue{ .register = reg };
1031 };
10141032
1015 return self.fail("TODO implement intCast for {}", .{self.target.cpu.arch});
1016 // return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
1033 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
10171034}
10181035
10191036fn truncRegister(
......@@ -1880,7 +1897,22 @@ fn airSetErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void {
18801897/// T to E!T
18811898fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) !void {
18821899 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1883 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement wrap errunion payload for {}", .{self.target.cpu.arch});
1900 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
1901 const error_union_ty = self.air.getRefType(ty_op.ty);
1902 const payload_ty = error_union_ty.errorUnionPayload();
1903 const operand = try self.resolveInst(ty_op.operand);
1904 if (!payload_ty.hasRuntimeBitsIgnoreComptime()) break :result operand;
1905
1906 const abi_size = @intCast(u32, error_union_ty.abiSize(self.target.*));
1907 const abi_align = error_union_ty.abiAlignment(self.target.*);
1908 const stack_offset = @intCast(u32, try self.allocMem(inst, abi_size, abi_align));
1909 const payload_off = errUnionPayloadOffset(payload_ty, self.target.*);
1910 const err_off = errUnionErrorOffset(payload_ty, self.target.*);
1911 try self.genSetStack(payload_ty, stack_offset - @intCast(u32, payload_off), operand);
1912 try self.genSetStack(Type.anyerror, stack_offset - @intCast(u32, err_off), .{ .immediate = 0 });
1913
1914 break :result MCValue{ .stack_offset = stack_offset };
1915 };
18841916 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
18851917}
18861918
......@@ -1890,10 +1922,18 @@ fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void {
18901922 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
18911923 const error_union_ty = self.air.getRefType(ty_op.ty);
18921924 const payload_ty = error_union_ty.errorUnionPayload();
1893 const mcv = try self.resolveInst(ty_op.operand);
1894 if (!payload_ty.hasRuntimeBits()) break :result mcv;
1925 const operand = try self.resolveInst(ty_op.operand);
1926 if (!payload_ty.hasRuntimeBitsIgnoreComptime()) break :result operand;
1927
1928 const abi_size = @intCast(u32, error_union_ty.abiSize(self.target.*));
1929 const abi_align = error_union_ty.abiAlignment(self.target.*);
1930 const stack_offset = @intCast(u32, try self.allocMem(inst, abi_size, abi_align));
1931 const payload_off = errUnionPayloadOffset(payload_ty, self.target.*);
1932 const err_off = errUnionErrorOffset(payload_ty, self.target.*);
1933 try self.genSetStack(Type.anyerror, stack_offset - @intCast(u32, err_off), operand);
1934 try self.genSetStack(payload_ty, stack_offset - @intCast(u32, payload_off), .undef);
18951935
1896 return self.fail("TODO implement wrap errunion error for non-empty payloads", .{});
1936 break :result MCValue{ .stack_offset = stack_offset };
18971937 };
18981938 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
18991939}
......@@ -4273,7 +4313,7 @@ fn br(self: *Self, block: Air.Inst.Index, operand: Air.Inst.Ref) !void {
42734313 block_data.mcv = switch (operand_mcv) {
42744314 .none, .dead, .unreach => unreachable,
42754315 .register, .stack_offset, .memory => operand_mcv,
4276 .immediate, .stack_argument_offset => blk: {
4316 .immediate, .stack_argument_offset, .cpsr_flags => blk: {
42774317 const new_mcv = try self.allocRegOrMem(block, true);
42784318 try self.setRegOrMem(self.air.typeOfIndex(block), new_mcv, operand_mcv);
42794319 break :blk new_mcv;
test/behavior/align.zig-2
......@@ -8,7 +8,6 @@ var foo: u8 align(4) = 100;
88
99test "global variable alignment" {
1010 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1211
1312 comptime try expect(@typeInfo(@TypeOf(&foo)).Pointer.alignment == 4);
1413 comptime try expect(@TypeOf(&foo) == *align(4) u8);
......@@ -223,7 +222,6 @@ fn testBytesAlign(b: u8) !void {
223222test "@alignCast slices" {
224223 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
225224 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
226 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
227225
228226 var array align(4) = [_]u32{ 1, 1 };
229227 const slice = array[0..];
test/behavior/array.zig-6
......@@ -59,7 +59,6 @@ test "array init with mult" {
5959
6060test "array literal with explicit type" {
6161 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
62 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
6362
6463 const hex_mult: [4]u16 = .{ 4096, 256, 16, 1 };
6564
......@@ -112,7 +111,6 @@ test "array with sentinels" {
112111 }
113112
114113 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
115 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
116114
117115 const S = struct {
118116 fn doTheTest(is_ct: bool) !void {
......@@ -162,7 +160,6 @@ test "nested arrays of strings" {
162160
163161test "nested arrays of integers" {
164162 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
165 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
166163 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
167164
168165 const array_of_numbers = [_][2]u8{
......@@ -190,7 +187,6 @@ fn plusOne(x: u32) u32 {
190187
191188test "single-item pointer to array indexing and slicing" {
192189 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
193 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
194190
195191 try testSingleItemPtrArrayIndexSlice();
196192 comptime try testSingleItemPtrArrayIndexSlice();
......@@ -313,7 +309,6 @@ test "comptime evaluating function that takes array by value" {
313309
314310test "runtime initialize array elem and then implicit cast to slice" {
315311 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
316 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
317312
318313 var two: i32 = 2;
319314 const x: []const i32 = &[_]i32{two};
......@@ -322,7 +317,6 @@ test "runtime initialize array elem and then implicit cast to slice" {
322317
323318test "array literal as argument to function" {
324319 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
325 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
326320
327321 const S = struct {
328322 fn entry(two: i32) !void {
test/behavior/basic.zig-9
......@@ -204,7 +204,6 @@ test "opaque types" {
204204 }
205205
206206 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
207 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
208207
209208 try expect(*OpaqueA != *OpaqueB);
210209
......@@ -365,7 +364,6 @@ fn testMemcpyMemset() !void {
365364}
366365
367366test "variable is allowed to be a pointer to an opaque type" {
368 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
369367 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
370368
371369 var x: i32 = 1234;
......@@ -457,7 +455,6 @@ fn testArray2DConstDoublePtr(ptr: *const f32) !void {
457455
458456test "double implicit cast in same expression" {
459457 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
460 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
461458
462459 var x = @as(i32, @as(u16, nine()));
463460 try expect(x == 9);
......@@ -616,8 +613,6 @@ test "self reference through fn ptr field" {
616613}
617614
618615test "global variable initialized to global variable array element" {
619 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
620
621616 try expect(global_ptr == &gdt[0]);
622617}
623618const GDTEntry = struct {
......@@ -681,7 +676,6 @@ test "explicit cast optional pointers" {
681676}
682677
683678test "pointer comparison" {
684 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
685679 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
686680
687681 const a = @as([]const u8, "a");
......@@ -787,7 +781,6 @@ test "pointer to thread local array" {
787781threadlocal var buffer: [11]u8 = undefined;
788782
789783test "auto created variables have correct alignment" {
790 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
791784 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
792785
793786 const S = struct {
......@@ -889,7 +882,6 @@ test "labeled block implicitly ends in a break" {
889882test "catch in block has correct result location" {
890883 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
891884 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
892 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
893885
894886 const S = struct {
895887 fn open() error{A}!@This() {
......@@ -920,7 +912,6 @@ test "labeled block with runtime branch forwards its result location type to bre
920912
921913test "try in labeled block doesn't cast to wrong type" {
922914 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
923 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
924915
925916 const S = struct {
926917 a: u32,
test/behavior/bitreverse.zig-1
......@@ -157,7 +157,6 @@ test "bitReverse vectors u0" {
157157 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
158158 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
159159 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
160 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
161160
162161 comptime try vector0();
163162 try vector0();
test/behavior/bugs/1076.zig-1
......@@ -5,7 +5,6 @@ const expect = std.testing.expect;
55
66test "comptime code should not modify constant data" {
77 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
98 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
109
1110 try testCastPtrOfArrayToSliceAndPtr();
test/behavior/bugs/11165.zig-4
......@@ -1,8 +1,6 @@
11const builtin = @import("builtin");
22
33test "bytes" {
4 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5
64 const S = struct {
75 a: u32,
86 c: [5]u8,
......@@ -23,8 +21,6 @@ test "bytes" {
2321}
2422
2523test "aggregate" {
26 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
27
2824 const S = struct {
2925 a: u32,
3026 c: [5]u8,
test/behavior/bugs/11213.zig-1
......@@ -4,7 +4,6 @@ const testing = std.testing;
44
55test {
66 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
87
98 const g: error{Test}!void = error.Test;
109
test/behavior/bugs/3779.zig-5
......@@ -8,7 +8,6 @@ const ptr_tag_name: [*:0]const u8 = tag_name;
88test "@tagName() returns a string literal" {
99 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // stage1 gets the type wrong
1010 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1211
1312 try std.testing.expect(*const [13:0]u8 == @TypeOf(tag_name));
1413 try std.testing.expect(std.mem.eql(u8, "TestEnumValue", tag_name));
......@@ -22,7 +21,6 @@ const ptr_error_name: [*:0]const u8 = error_name;
2221test "@errorName() returns a string literal" {
2322 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // stage1 gets the type wrong
2423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
25 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2624
2725 try std.testing.expect(*const [13:0]u8 == @TypeOf(error_name));
2826 try std.testing.expect(std.mem.eql(u8, "TestErrorCode", error_name));
......@@ -36,7 +34,6 @@ const ptr_type_name: [*:0]const u8 = type_name;
3634test "@typeName() returns a string literal" {
3735 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // stage1 gets the type wrong
3836 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
39 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
4037
4138 try std.testing.expect(*const [type_name.len:0]u8 == @TypeOf(type_name));
4239 try std.testing.expect(std.mem.eql(u8, "behavior.bugs.3779.TestType", type_name));
......@@ -49,7 +46,6 @@ const expected_contents = "hello zig\n";
4946
5047test "@embedFile() returns a string literal" {
5148 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
52 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5349
5450 try std.testing.expect(*const [expected_contents.len:0]u8 == @TypeOf(actual_contents));
5551 try std.testing.expect(std.mem.eql(u8, expected_contents, actual_contents));
......@@ -63,7 +59,6 @@ fn testFnForSrc() std.builtin.SourceLocation {
6359
6460test "@src() returns a struct containing 0-terminated string slices" {
6561 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6762
6863 const src = testFnForSrc();
6964 try std.testing.expect([:0]const u8 == @TypeOf(src.file));
test/behavior/bugs/394.zig-1
......@@ -11,7 +11,6 @@ const expect = @import("std").testing.expect;
1111const builtin = @import("builtin");
1212
1313test "fixed" {
14 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1514 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
1615 const x = S{
1716 .x = 3,
test/behavior/bugs/7187.zig-2
......@@ -3,8 +3,6 @@ const builtin = @import("builtin");
33const expect = std.testing.expect;
44
55test "miscompilation with bool return type" {
6 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7
86 var x: usize = 1;
97 var y: bool = getFalse();
108 _ = y;
test/behavior/byteswap.zig-1
......@@ -118,7 +118,6 @@ test "@byteSwap vectors u0" {
118118 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
119119 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
120120 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
121 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
122121
123122 comptime try vector0();
124123 try vector0();
test/behavior/byval_arg_var.zig-1
......@@ -6,7 +6,6 @@ var result: []const u8 = "wrong";
66test "pass string literal byvalue to a generic var param" {
77 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
88 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
109
1110 start();
1211 blowUpStack(10);
test/behavior/cast.zig-11
......@@ -251,7 +251,6 @@ fn MakeType(comptime T: type) type {
251251
252252test "implicit cast from *[N]T to [*c]T" {
253253 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
254 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
255254
256255 var x: [4]u16 = [4]u16{ 0, 1, 2, 3 };
257256 var y: [*c]u16 = &x;
......@@ -372,7 +371,6 @@ test "cast from ?[*]T to ??[*]T" {
372371
373372test "peer type unsigned int to signed" {
374373 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
375 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
376374
377375 var w: u31 = 5;
378376 var x: u8 = 7;
......@@ -451,7 +449,6 @@ fn castToOptionalTypeError(z: i32) !void {
451449test "implicitly cast from [0]T to anyerror![]T" {
452450 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
453451 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
454 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
455452
456453 try testCastZeroArrayToErrSliceMut();
457454 comptime try testCastZeroArrayToErrSliceMut();
......@@ -817,7 +814,6 @@ test "peer type resolution: error union after non-error" {
817814test "peer cast *[0]T to E![]const T" {
818815 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
819816 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
820 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
821817 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
822818
823819 var buffer: [5]u8 = "abcde".*;
......@@ -832,7 +828,6 @@ test "peer cast *[0]T to E![]const T" {
832828test "peer cast *[0]T to []const T" {
833829 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
834830 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
835 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
836831 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
837832
838833 var buffer: [5]u8 = "abcde".*;
......@@ -893,7 +888,6 @@ test "peer cast [:x]T to []T" {
893888test "peer cast [N:x]T to [N]T" {
894889 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
895890 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
896 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
897891
898892 const S = struct {
899893 fn doTheTest() !void {
......@@ -909,7 +903,6 @@ test "peer cast [N:x]T to [N]T" {
909903test "peer cast *[N:x]T to *[N]T" {
910904 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
911905 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
912 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
913906
914907 const S = struct {
915908 fn doTheTest() !void {
......@@ -1146,7 +1139,6 @@ test "implicit ptr to *anyopaque" {
11461139
11471140test "return null from fn() anyerror!?&T" {
11481141 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1149 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11501142
11511143 const a = returnNullFromOptionalTypeErrorRef();
11521144 const b = returnNullLitFromOptionalTypeErrorRef();
......@@ -1248,7 +1240,6 @@ fn incrementVoidPtrValue(value: ?*anyopaque) void {
12481240test "implicit cast *[0]T to E![]const u8" {
12491241 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12501242 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1251 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12521243
12531244 var x = @as(anyerror![]const u8, &[0]u8{});
12541245 try expect((x catch unreachable).len == 0);
......@@ -1387,7 +1378,6 @@ test "peer type resolution: unreachable, null, slice" {
13871378
13881379test "cast i8 fn call peers to i32 result" {
13891380 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1390 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13911381
13921382 const S = struct {
13931383 fn doTheTest() !void {
......@@ -1417,7 +1407,6 @@ test "cast compatible optional types" {
14171407
14181408test "coerce undefined single-item pointer of array to error union of slice" {
14191409 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1420 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14211410
14221411 const a = @as([*]u8, undefined)[0..0];
14231412 var b: error{a}![]const u8 = a;
test/behavior/comptime_memory.zig-1
......@@ -5,7 +5,6 @@ const ptr_size = @sizeOf(usize);
55
66test "type pun signed and unsigned as single pointer" {
77 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
98
109 comptime {
1110 var x: u32 = 0;
test/behavior/enum.zig-1
......@@ -24,7 +24,6 @@ fn testIntToEnumEval(x: i32) !void {
2424const IntToEnumNumber = enum { Zero, One, Two, Three, Four };
2525
2626test "int to enum" {
27 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2827 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2928
3029 try testIntToEnumEval(3);
test/behavior/error.zig-13
......@@ -29,7 +29,6 @@ fn shouldBeNotEqual(a: anyerror, b: anyerror) void {
2929}
3030
3131test "error binary operator" {
32 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
3332 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3433
3534 const a = errBinaryOperatorG(true) catch 3;
......@@ -61,14 +60,12 @@ pub fn baz() anyerror!i32 {
6160}
6261
6362test "error wrapping" {
64 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
6563 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
6664
6765 try expect((baz() catch unreachable) == 15);
6866}
6967
7068test "unwrap simple value from error" {
71 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7269 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7370
7471 const i = unwrapSimpleValueFromErrorDo() catch unreachable;
......@@ -79,7 +76,6 @@ fn unwrapSimpleValueFromErrorDo() anyerror!isize {
7976}
8077
8178test "error return in assignment" {
82 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8379 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
8480
8581 doErrReturnInAssignment() catch unreachable;
......@@ -126,7 +122,6 @@ test "debug info for optional error set" {
126122}
127123
128124test "implicit cast to optional to error union to return result loc" {
129 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
130125 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
131126
132127 const S = struct {
......@@ -149,7 +144,6 @@ test "implicit cast to optional to error union to return result loc" {
149144
150145test "fn returning empty error set can be passed as fn returning any error" {
151146 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
152 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
153147 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
154148
155149 entry();
......@@ -159,7 +153,6 @@ test "fn returning empty error set can be passed as fn returning any error" {
159153test "fn returning empty error set can be passed as fn returning any error - pointer" {
160154 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
161155 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
162 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
163156 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
164157
165158 entryPtr();
......@@ -249,7 +242,6 @@ fn testExplicitErrorSetCast(set1: Set1) !void {
249242
250243test "comptime test error for empty error set" {
251244 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
252 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
253245 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
254246
255247 try testComptimeTestErrorEmptySet(1234);
......@@ -268,7 +260,6 @@ fn testComptimeTestErrorEmptySet(x: EmptyErrorSet!i32) !void {
268260test "comptime err to int of error set with only 1 possible value" {
269261 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
270262 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
271 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
272263 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
273264
274265 testErrToIntWithOnePossibleValue(error.A, @errorToInt(error.A));
......@@ -323,7 +314,6 @@ fn quux_1() !i32 {
323314}
324315
325316test "error: Zero sized error set returned with value payload crash" {
326 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
327317 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
328318
329319 _ = try foo3(0);
......@@ -422,7 +412,6 @@ test "nested error union function call in optional unwrap" {
422412
423413test "return function call to error set from error union function" {
424414 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
425 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
426415 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
427416
428417 const S = struct {
......@@ -455,7 +444,6 @@ test "optional error set is the same size as error set" {
455444
456445test "nested catch" {
457446 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
458 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
459447 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
460448
461449 const S = struct {
......@@ -487,7 +475,6 @@ test "function pointer with return type that is error union with payload which i
487475
488476 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
489477 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
490 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
491478 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
492479
493480 const S = struct {
test/behavior/eval.zig-8
......@@ -90,7 +90,6 @@ fn letsTryToCompareBools(a: bool, b: bool) bool {
9090 return max(bool, a, b);
9191}
9292test "inlined block and runtime block phi" {
93 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9493 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
9594
9695 try expect(letsTryToCompareBools(true, true));
......@@ -390,7 +389,6 @@ test "return 0 from function that has u0 return type" {
390389}
391390
392391test "statically initialized struct" {
393 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
394392 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
395393
396394 st_init_str_foo.x += 1;
......@@ -502,7 +500,6 @@ test "comptime shlWithOverflow" {
502500}
503501
504502test "const ptr to variable data changes at runtime" {
505 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
506503 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
507504
508505 try expect(foo_ref.name[0] == 'a');
......@@ -605,8 +602,6 @@ fn testCompTimeUIntComparisons(x: u32) void {
605602const hi1 = "hi";
606603const hi2 = hi1;
607604test "const global shares pointer with other same one" {
608 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
609
610605 try assertEqualPtrs(&hi1[0], &hi2[0]);
611606 comptime try expect(&hi1[0] == &hi2[0]);
612607}
......@@ -976,7 +971,6 @@ test "closure capture type of runtime-known parameter" {
976971
977972test "comptime break passing through runtime condition converted to runtime break" {
978973 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
979 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
980974
981975 const S = struct {
982976 fn doTheTest() !void {
......@@ -1061,7 +1055,6 @@ test "comptime break operand passing through runtime condition converted to runt
10611055test "comptime break operand passing through runtime switch converted to runtime break" {
10621056 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
10631057 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1064 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10651058
10661059 const S = struct {
10671060 fn doTheTest(runtime: u8) !void {
......@@ -1227,7 +1220,6 @@ test "storing an array of type in a field" {
12271220test "pass pointer to field of comptime-only type as a runtime parameter" {
12281221 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12291222 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1230 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12311223
12321224 const S = struct {
12331225 const Mixed = struct {
test/behavior/fn.zig-1
......@@ -197,7 +197,6 @@ fn addPointCoords(pt: Point) i32 {
197197}
198198
199199test "pass by non-copying value through var arg" {
200 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
201200 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
202201
203202 try expect((try addPointCoordsVar(Point{ .x = 1, .y = 2 })) == 3);
test/behavior/if.zig-1
......@@ -44,7 +44,6 @@ 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_arm) return error.SkipZigTest;
4847 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
4948
5049 if (global_with_val) |v| {
test/behavior/math.zig-3
......@@ -652,7 +652,6 @@ test "@addWithOverflow" {
652652
653653test "small int addition" {
654654 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
655 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
656655
657656 var x: u2 = 0;
658657 try expect(x == 0);
......@@ -1136,8 +1135,6 @@ fn testShrExact(x: u8) !void {
11361135}
11371136
11381137test "shift left/right on u0 operand" {
1139 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1140
11411138 const S = struct {
11421139 fn doTheTest() !void {
11431140 var x: u0 = 0;
test/behavior/pointers.zig-5
......@@ -84,7 +84,6 @@ test "assigning integer to C pointer" {
8484
8585test "C pointer comparison and arithmetic" {
8686 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
87 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8887
8988 const S = struct {
9089 fn doTheTest() !void {
......@@ -430,7 +429,6 @@ test "indexing array with sentinel returns correct type" {
430429
431430test "element pointer to slice" {
432431 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
433 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
434432
435433 const S = struct {
436434 fn doTheTest() !void {
......@@ -452,7 +450,6 @@ test "element pointer to slice" {
452450
453451test "element pointer arithmetic to slice" {
454452 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
455 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
456453
457454 const S = struct {
458455 fn doTheTest() !void {
......@@ -476,8 +473,6 @@ test "element pointer arithmetic to slice" {
476473}
477474
478475test "array slicing to slice" {
479 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
480
481476 const S = struct {
482477 fn doTheTest() !void {
483478 var str: [5]i32 = [_]i32{ 1, 2, 3, 4, 5 };
test/behavior/reflection.zig-1
......@@ -27,7 +27,6 @@ fn dummy(a: bool, b: i32, c: f32) i32 {
2727
2828test "reflection: @field" {
2929 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
30 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3130 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
3231
3332 var f = Foo{
test/behavior/slice.zig-5
......@@ -118,7 +118,6 @@ test "slice of type" {
118118
119119test "generic malloc free" {
120120 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
121 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
122121 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
123122
124123 const a = memAlloc(u8, 10) catch unreachable;
......@@ -482,7 +481,6 @@ test "slice pointer-to-array null terminated" {
482481 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
483482 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
484483 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
485 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
486484
487485 comptime {
488486 var array = [5:0]u8{ 1, 2, 3, 4, 5 };
......@@ -508,7 +506,6 @@ test "slice pointer-to-array null terminated" {
508506test "slice pointer-to-array zero length" {
509507 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
510508 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
511 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
512509
513510 comptime {
514511 {
......@@ -643,7 +640,6 @@ test "slicing array with sentinel as end index" {
643640 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
644641 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
645642 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
646 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
647643
648644 const S = struct {
649645 fn do() !void {
......@@ -664,7 +660,6 @@ test "slicing slice with sentinel as end index" {
664660 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
665661 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
666662 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
667 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
668663
669664 const S = struct {
670665 fn do() !void {
test/behavior/struct_contains_slice_of_itself.zig-2
......@@ -13,7 +13,6 @@ const NodeAligned = struct {
1313
1414test "struct contains slice of itself" {
1515 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
16 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1716 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1817
1918 var other_nodes = [_]Node{
......@@ -54,7 +53,6 @@ test "struct contains slice of itself" {
5453
5554test "struct contains aligned slice of itself" {
5655 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
57 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5856 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5957
6058 var other_nodes = [_]NodeAligned{
test/behavior/tuple.zig-1
......@@ -124,7 +124,6 @@ test "tuple initializer for var" {
124124test "array-like initializer for tuple types" {
125125 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
126126 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
127 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
128127
129128 const T = @Type(.{
130129 .Struct = .{
test/behavior/type_info.zig-2
......@@ -527,7 +527,6 @@ test "type info for async frames" {
527527
528528test "Declarations are returned in declaration order" {
529529 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
530 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
531530 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
532531
533532 const S = struct {
......@@ -552,7 +551,6 @@ test "Struct.is_tuple for anon list literal" {
552551test "Struct.is_tuple for anon struct literal" {
553552 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
554553 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
555 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
556554
557555 const info = @typeInfo(@TypeOf(.{ .a = 0 }));
558556 try expect(!info.Struct.is_tuple);
test/behavior/union.zig-7
......@@ -36,7 +36,6 @@ test "init union with runtime value - floats" {
3636}
3737
3838test "basic unions" {
39 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
4039 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
4140
4241 var foo = Foo{ .int = 1 };
......@@ -91,7 +90,6 @@ const FooExtern = extern union {
9190};
9291
9392test "basic extern unions" {
94 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
9593 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9694
9795 var foo = FooExtern{ .int = 1 };
......@@ -398,7 +396,6 @@ test "tagged union with no payloads" {
398396}
399397
400398test "union with only 1 field casted to its enum type" {
401 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
402399 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
403400
404401 const Literal = union(enum) {
......@@ -487,7 +484,6 @@ test "union initializer generates padding only if needed" {
487484}
488485
489486test "runtime tag name with single field" {
490 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
491487 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
492488
493489 const U = union(enum) {
......@@ -540,7 +536,6 @@ const Baz = enum { A, B, C, D };
540536
541537test "tagged union type" {
542538 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
543 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
544539 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
545540
546541 const foo1 = TaggedFoo{ .One = 13 };
......@@ -670,7 +665,6 @@ const PartialInstWithPayload = union(enum) {
670665};
671666
672667test "union with only 1 field casted to its enum type which has enum value specified" {
673 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
674668 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
675669
676670 const Literal = union(enum) {
......@@ -1110,7 +1104,6 @@ test "union enum type gets a separate scope" {
11101104
11111105test "global variable struct contains union initialized to non-most-aligned field" {
11121106 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1113 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11141107
11151108 const T = struct {
11161109 const U = union(enum) {
test/behavior/var_args.zig-1
......@@ -39,7 +39,6 @@ fn addSomeStuff(args: anytype) i32 {
3939}
4040
4141test "runtime parameter before var args" {
42 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
4342 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
4443
4544 try expect((try extraFn(10, .{})) == 0);
test/behavior/while.zig-2
......@@ -256,7 +256,6 @@ fn returnWithImplicitCastFromWhileLoopTest() anyerror!void {
256256}
257257
258258test "while on error union with else result follow else prong" {
259 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
260259 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
261260
262261 const result = while (returnError()) |value| {
......@@ -266,7 +265,6 @@ test "while on error union with else result follow else prong" {
266265}
267266
268267test "while on error union with else result follow break prong" {
269 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
270268 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
271269
272270 const result = while (returnSuccess(10)) |value| {
test/behavior/widening.zig-1
......@@ -30,7 +30,6 @@ test "integer widening u0 to u8" {
3030test "implicit unsigned integer to signed integer" {
3131 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
3232 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
33 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3433 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
3534
3635 var a: u8 = 250;