stage2: make error{} the same size as anyerror

Having `error{}` be a zero bit type causes issues when it interracts
with empty inferred error sets which are the same size as `anyerror`.
This commit is contained in:
Veikka Tuominen
2022-06-10 14:11:59 +03:00
parent 488e1e5f51
commit 0333ff4476
11 changed files with 123 additions and 476 deletions

View File

@@ -453,65 +453,6 @@ test "optional error set is the same size as error set" {
comptime try expect(S.returnsOptErrSet() == null);
}
test "optional error set with only one error is the same size as bool" {
if (builtin.zig_backend == .stage1) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
const E = error{only};
comptime try expect(@sizeOf(?E) == @sizeOf(bool));
comptime try expect(@alignOf(?E) == @alignOf(bool));
const S = struct {
fn gimmeNull() ?E {
return null;
}
fn gimmeErr() ?E {
return error.only;
}
};
try expect(S.gimmeNull() == null);
try expect(error.only == S.gimmeErr().?);
comptime try expect(S.gimmeNull() == null);
comptime try expect(error.only == S.gimmeErr().?);
}
test "optional empty error set" {
if (builtin.zig_backend == .stage1) return error.SkipZigTest;
comptime try expect(@sizeOf(error{}!void) == @sizeOf(void));
comptime try expect(@alignOf(error{}!void) == @alignOf(void));
var x: ?error{} = undefined;
if (x != null) {
@compileError("test failed");
}
}
test "empty error set plus zero-bit payload" {
if (builtin.zig_backend == .stage1) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
comptime try expect(@sizeOf(error{}!void) == @sizeOf(void));
comptime try expect(@alignOf(error{}!void) == @alignOf(void));
var x: error{}!void = undefined;
if (x) |payload| {
if (payload != {}) {
@compileError("test failed");
}
} else |_| {
@compileError("test failed");
}
const S = struct {
fn empty() error{}!void {}
fn inferred() !void {
return empty();
}
};
try S.inferred();
}
test "nested catch" {
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO