aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
Diffstat (limited to 'std')
-rw-r--r--std/special/start.zig34
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),
}
}