Commit 9270aae071

Tadeo Kondrak <me@tadeo.ca>
2021-02-12 21:40:44
stage2: fix zero-sized function parameters (#7998)
1 parent d3565ed
Changed files (2)
src
test
stage2
src/codegen.zig
@@ -3705,17 +3705,22 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
                             for (param_types) |ty, i| {
                                 switch (ty.zigTypeTag()) {
                                     .Bool, .Int => {
-                                        const param_size = @intCast(u32, ty.abiSize(self.target.*));
-                                        if (next_int_reg >= c_abi_int_param_regs.len) {
-                                            result.args[i] = .{ .stack_offset = next_stack_offset };
-                                            next_stack_offset += param_size;
+                                        if (!ty.hasCodeGenBits()) {
+                                            assert(cc != .C);
+                                            result.args[i] = .{ .none = {} };
                                         } else {
-                                            const aliased_reg = registerAlias(
-                                                c_abi_int_param_regs[next_int_reg],
-                                                param_size,
-                                            );
-                                            result.args[i] = .{ .register = aliased_reg };
-                                            next_int_reg += 1;
+                                            const param_size = @intCast(u32, ty.abiSize(self.target.*));
+                                            if (next_int_reg >= c_abi_int_param_regs.len) {
+                                                result.args[i] = .{ .stack_offset = next_stack_offset };
+                                                next_stack_offset += param_size;
+                                            } else {
+                                                const aliased_reg = registerAlias(
+                                                    c_abi_int_param_regs[next_int_reg],
+                                                    param_size,
+                                                );
+                                                result.args[i] = .{ .register = aliased_reg };
+                                                next_int_reg += 1;
+                                            }
                                         }
                                     },
                                     else => return self.fail(src, "TODO implement function parameters of type {s}", .{@tagName(ty.zigTypeTag())}),
test/stage2/test.zig
@@ -1393,4 +1393,26 @@ pub fn addCases(ctx: *TestContext) !void {
             "",
         );
     }
+
+    {
+        var case = ctx.exe("passing u0 to function", linux_x64);
+        case.addCompareOutput(
+            \\export fn _start() noreturn {
+            \\    doNothing(0);
+            \\    exit();
+            \\}
+            \\fn doNothing(arg: u0) void {}
+            \\fn exit() noreturn {
+            \\    asm volatile ("syscall"
+            \\        :
+            \\        : [number] "{rax}" (231),
+            \\          [arg1] "{rdi}" (0)
+            \\        : "rcx", "r11", "memory"
+            \\    );
+            \\    unreachable;
+            \\}
+        ,
+            "",
+        );
+    }
 }