authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-01-02 17:03:21+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-02 15:15:59-05:00
logc710d5eefe3f83226f1651947239730e77af43cb
tree0cbae154410b4def95af396c78a6c2dbbd91b0eb
parent36b069910ef71278ad3aaf059f12144d8b86e856

stage2 ARM: implement wrap_errunion_err for empty payloads


3 files changed, 31 insertions(+), 10 deletions(-)

src/arch/arm/CodeGen.zig+8-1
......@@ -1160,7 +1160,14 @@ fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) !void {
11601160/// E to E!T
11611161fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void {
11621162 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1163 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement wrap errunion error for {}", .{self.target.cpu.arch});
1163 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
1164 const error_union_ty = self.air.getRefType(ty_op.ty);
1165 const payload_ty = error_union_ty.errorUnionPayload();
1166 const mcv = try self.resolveInst(ty_op.operand);
1167 if (!payload_ty.hasCodeGenBits()) break :result mcv;
1168
1169 return self.fail("TODO implement wrap errunion error for non-empty payloads", .{});
1170 };
11641171 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
11651172}
11661173
test/behavior.zig+9-9
......@@ -2,10 +2,19 @@ const builtin = @import("builtin");
22
33test {
44 // Tests that pass for stage1, llvm backend, C backend, wasm backend, and arm backend.
5 _ = @import("behavior/bugs/679.zig");
56 _ = @import("behavior/bugs/1111.zig");
67 _ = @import("behavior/bugs/2346.zig");
78 _ = @import("behavior/bugs/3586.zig");
9 _ = @import("behavior/bugs/4560.zig");
10 _ = @import("behavior/bugs/6850.zig");
811 _ = @import("behavior/slice_sentinel_comptime.zig");
12 _ = @import("behavior/fn_in_struct_in_comptime.zig");
13 _ = @import("behavior/hasfield.zig");
14 _ = @import("behavior/hasdecl.zig");
15 _ = @import("behavior/pub_enum.zig");
16 _ = @import("behavior/type_info.zig");
17 _ = @import("behavior/type.zig");
918
1019 if (!builtin.zig_is_stage2 or builtin.stage2_arch != .arm) {
1120 // Tests that pass for stage1, llvm backend, C backend, wasm backend.
......@@ -14,36 +23,27 @@ test {
1423 _ = @import("behavior/bool.zig");
1524 _ = @import("behavior/bugs/624.zig");
1625 _ = @import("behavior/bugs/655.zig");
17 _ = @import("behavior/bugs/679.zig");
1826 _ = @import("behavior/bugs/704.zig");
1927 _ = @import("behavior/bugs/1486.zig");
2028 _ = @import("behavior/bugs/2692.zig");
2129 _ = @import("behavior/bugs/2889.zig");
2230 _ = @import("behavior/bugs/3046.zig");
23 _ = @import("behavior/bugs/4560.zig");
2431 _ = @import("behavior/bugs/4769_a.zig");
2532 _ = @import("behavior/bugs/4769_b.zig");
2633 _ = @import("behavior/bugs/4954.zig");
27 _ = @import("behavior/bugs/6850.zig");
2834 _ = @import("behavior/byval_arg_var.zig");
2935 _ = @import("behavior/call.zig");
3036 _ = @import("behavior/defer.zig");
3137 _ = @import("behavior/enum.zig");
3238 _ = @import("behavior/error.zig");
33 _ = @import("behavior/fn_in_struct_in_comptime.zig");
34 _ = @import("behavior/hasdecl.zig");
35 _ = @import("behavior/hasfield.zig");
3639 _ = @import("behavior/if.zig");
3740 _ = @import("behavior/import.zig");
3841 _ = @import("behavior/incomplete_struct_param_tld.zig");
3942 _ = @import("behavior/inttoptr.zig");
4043 _ = @import("behavior/pointers.zig");
4144 _ = @import("behavior/ptrcast.zig");
42 _ = @import("behavior/pub_enum.zig");
4345 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
4446 _ = @import("behavior/truncate.zig");
45 _ = @import("behavior/type_info.zig");
46 _ = @import("behavior/type.zig");
4747 _ = @import("behavior/usingnamespace.zig");
4848 _ = @import("behavior/underscore.zig");
4949
test/stage2/arm.zig+14
......@@ -665,6 +665,20 @@ pub fn addCases(ctx: *TestContext) !void {
665665 ,
666666 "",
667667 );
668
669 case.addCompareOutput(
670 \\pub fn main() void {
671 \\ foo() catch unreachable;
672 \\}
673 \\
674 \\fn foo() anyerror!void {
675 \\ try bar();
676 \\}
677 \\
678 \\fn bar() anyerror!void {}
679 ,
680 "",
681 );
668682 }
669683
670684 {