diff --git a/src/test.zig b/src/test.zig index 6801433b7f..cba11d7a25 100644 --- a/src/test.zig +++ b/src/test.zig @@ -235,9 +235,9 @@ const TestManifest = struct { inner: std.mem.SplitIterator(u8), parse_fn: ParseFn(T), - fn next(self: *@This()) ?T { + fn next(self: *@This()) !?T { const next_raw = self.inner.next() orelse return null; - return self.parse_fn(next_raw); + return try self.parse_fn(next_raw); } }; } @@ -339,20 +339,20 @@ const TestManifest = struct { allocator: Allocator, key: []const u8, comptime T: type, - ) error{OutOfMemory}![]const T { + ) ![]const T { var out = std.ArrayList(T).init(allocator); defer out.deinit(); var it = self.getConfigForKey(key, T); - while (it.next()) |item| { + while (try it.next()) |item| { try out.append(item); } return out.toOwnedSlice(); } - fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) T { + fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) !T { var it = self.getConfigForKey(key, T); - const res = it.next().?; - assert(it.next() == null); + const res = (try it.next()) orelse unreachable; + assert((try it.next()) == null); return res; } @@ -373,33 +373,36 @@ const TestManifest = struct { } fn ParseFn(comptime T: type) type { - return fn ([]const u8) ?T; + return fn ([]const u8) anyerror!T; } fn getDefaultParser(comptime T: type) ParseFn(T) { switch (@typeInfo(T)) { .Int => return struct { - fn parse(str: []const u8) ?T { - return std.fmt.parseInt(T, str, 0) catch null; + fn parse(str: []const u8) anyerror!T { + return try std.fmt.parseInt(T, str, 0); } }.parse, .Bool => return struct { - fn parse(str: []const u8) ?T { - const as_int = std.fmt.parseInt(u1, str, 0) catch return null; + fn parse(str: []const u8) anyerror!T { + const as_int = try std.fmt.parseInt(u1, str, 0); return as_int > 0; } }.parse, .Enum => return struct { - fn parse(str: []const u8) ?T { - return std.meta.stringToEnum(T, str); + fn parse(str: []const u8) anyerror!T { + return std.meta.stringToEnum(T, str) orelse { + std.log.err("unknown enum variant for {s}: {s}", .{ @typeName(T), str }); + return error.UnknownEnumVariant; + }; } }.parse, .Struct => if (comptime std.mem.eql(u8, @typeName(T), "CrossTarget")) return struct { - fn parse(str: []const u8) ?T { + fn parse(str: []const u8) anyerror!T { var opts = CrossTarget.ParseOptions{ .arch_os_abi = str, }; - return CrossTarget.parse(opts) catch null; + return try CrossTarget.parse(opts); } }.parse else @compileError("no default parser for " ++ @typeName(T)), else => @compileError("no default parser for " ++ @typeName(T)), @@ -1128,8 +1131,8 @@ pub const TestContext = struct { if (cases.items.len == 0) { const backends = try manifest.getConfigForKeyAlloc(ctx.arena, "backend", Backend); const targets = try manifest.getConfigForKeyAlloc(ctx.arena, "target", CrossTarget); - const is_test = manifest.getConfigForKeyAssertSingle("is_test", bool); - const output_mode = manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode); + const is_test = try manifest.getConfigForKeyAssertSingle("is_test", bool); + const output_mode = try manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode); const name_prefix = blk: { const ext_index = std.mem.lastIndexOfScalar(u8, current_file.*, '.') orelse diff --git a/test/cases/llvm/nested_blocks.zig b/test/cases/llvm/nested_blocks.zig index 47b6c5069b..895f7e658b 100644 --- a/test/cases/llvm/nested_blocks.zig +++ b/test/cases/llvm/nested_blocks.zig @@ -19,6 +19,6 @@ pub fn main() void { } // run -// backend=stage2, llvm +// backend=stage2,llvm // target=x86_64-linux,x86_64-macos // diff --git a/test/cases/recursive_inline_function.0.zig b/test/cases/recursive_inline_function.0.zig index c8333c9065..45a29a1068 100644 --- a/test/cases/recursive_inline_function.0.zig +++ b/test/cases/recursive_inline_function.0.zig @@ -9,4 +9,5 @@ inline fn fibonacci(n: usize) usize { } // run +// target=x86_64-linux,arm-linux,x86_64-macos,wasm32-wasi //