diff options
Diffstat (limited to 'std')
| -rw-r--r-- | std/special/start.zig | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/std/special/start.zig b/std/special/start.zig index 76dfe420c4..f2fe27e26c 100644 --- a/std/special/start.zig +++ b/std/special/start.zig @@ -128,6 +128,9 @@ extern fn main(c_argc: i32, c_argv: [*][*]u8, c_envp: [*]?[*]u8) i32 { // This is marked inline because for some reason LLVM in release mode fails to inline it, // and we want fewer call frames in stack traces. inline fn callMain() u8 { + // General error message for a malformed return type + const compile_err_prefix = "expected return type of main to be 'u8', 'noreturn', 'void', '!void', or '!u8', found '"; + const compile_err = compile_err_prefix ++ @typeName(@typeOf(root.main).ReturnType) ++ "'"; switch (@typeId(@typeOf(root.main).ReturnType)) { .NoReturn => { root.main(); @@ -138,23 +141,30 @@ inline fn callMain() u8 { }, .Int => { if (@typeOf(root.main).ReturnType.bit_count != 8) { - @compileError("expected return type of main to be 'u8', 'noreturn', 'void', or '!void'"); + @compileError(compile_err); } return root.main(); }, - .ErrorUnion => { - root.main() catch |err| { - std.debug.warn("error: {}\n", @errorName(err)); - if (builtin.os != builtin.Os.zen) { - if (@errorReturnTrace()) |trace| { - std.debug.dumpStackTrace(trace.*); + builtin.TypeId.ErrorUnion => { + const PayloadType = @typeOf(root.main).ReturnType.Payload; + // In this case the error should include the payload type + const payload_err = compile_err_prefix ++ "!" ++ @typeName(PayloadType) ++ "'"; + // If the payload is void or a u8 + if (@typeId(PayloadType) == builtin.TypeId.Void or (@typeId(PayloadType) == builtin.TypeId.Int and PayloadType.bit_count == 8)) { + const tmp = root.main() catch |err| { + std.debug.warn("error: {}\n", @errorName(err)); + if (builtin.os != builtin.Os.zen) { + if (@errorReturnTrace()) |trace| { + std.debug.dumpStackTrace(trace.*); + } } - } - return 1; - }; - return 0; + return 1; + }; + // If main didn't error, return 0 or the exit code + return if (PayloadType == void) 0 else tmp; + } else @compileError(payload_err); }, - else => @compileError("expected return type of main to be 'u8', 'noreturn', 'void', or '!void'"), + else => @compileError(compile_err), } } |
