diff --git a/lib/std/Build.zig b/lib/std/Build.zig index 0cade2b6f3..34806adf48 100644 --- a/lib/std/Build.zig +++ b/lib/std/Build.zig @@ -679,8 +679,7 @@ pub fn addRunArtifact(b: *Build, exe: *CompileStep) *RunStep { run_step.addArtifactArg(exe); if (exe.kind == .@"test") { - run_step.stdio = .zig_test; - run_step.addArgs(&.{"--listen=-"}); + run_step.enableTestRunnerMode(); } if (exe.vcpkg_bin_path) |path| { diff --git a/lib/std/Build/RunStep.zig b/lib/std/Build/RunStep.zig index 5658c5936f..9d1fd85e39 100644 --- a/lib/std/Build/RunStep.zig +++ b/lib/std/Build/RunStep.zig @@ -140,6 +140,11 @@ pub fn setName(self: *RunStep, name: []const u8) void { self.rename_step_with_output_arg = false; } +pub fn enableTestRunnerMode(rs: *RunStep) void { + rs.stdio = .zig_test; + rs.addArgs(&.{"--listen=-"}); +} + pub fn addArtifactArg(self: *RunStep, artifact: *CompileStep) void { self.argv.append(Arg{ .artifact = artifact }) catch @panic("OOM"); self.step.dependOn(&artifact.step); diff --git a/lib/std/zig/Server.zig b/lib/std/zig/Server.zig index 788e361782..0c099744cc 100644 --- a/lib/std/zig/Server.zig +++ b/lib/std/zig/Server.zig @@ -104,11 +104,9 @@ pub fn receiveMessage(s: *Server) !InMessage.Header { const buf = fifo.readableSlice(0); assert(fifo.readableLength() == buf.len); if (buf.len >= @sizeOf(Header)) { - const header = @ptrCast(*align(1) const Header, buf[0..@sizeOf(Header)]); // workaround for https://github.com/ziglang/zig/issues/14904 - const bytes_len = bswap_and_workaround_u32(&header.bytes_len); - // workaround for https://github.com/ziglang/zig/issues/14904 - const tag = bswap_and_workaround_tag(&header.tag); + const bytes_len = bswap_and_workaround_u32(buf[4..][0..4]); + const tag = bswap_and_workaround_tag(buf[0..][0..4]); if (buf.len - @sizeOf(Header) >= bytes_len) { fifo.discard(@sizeOf(Header)); @@ -281,14 +279,12 @@ fn bswap_u32_array(slice: []u32) void { } /// workaround for https://github.com/ziglang/zig/issues/14904 -fn bswap_and_workaround_u32(x: *align(1) const u32) u32 { - const bytes_ptr = @ptrCast(*const [4]u8, x); +fn bswap_and_workaround_u32(bytes_ptr: *const [4]u8) u32 { return std.mem.readIntLittle(u32, bytes_ptr); } /// workaround for https://github.com/ziglang/zig/issues/14904 -fn bswap_and_workaround_tag(x: *align(1) const InMessage.Tag) InMessage.Tag { - const bytes_ptr = @ptrCast(*const [4]u8, x); +fn bswap_and_workaround_tag(bytes_ptr: *const [4]u8) InMessage.Tag { const int = std.mem.readIntLittle(u32, bytes_ptr); return @intToEnum(InMessage.Tag, int); } diff --git a/test/behavior/atomics.zig b/test/behavior/atomics.zig index 04dd2661bb..6b6e7c8430 100644 --- a/test/behavior/atomics.zig +++ b/test/behavior/atomics.zig @@ -209,6 +209,12 @@ test "atomicrmw with floats" { if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) { + // TODO: test.c:34929:7: error: address argument to atomic operation must be a pointer to integer or pointer ('zig_f32 *' (aka 'float *') invalid + // when compiling with -std=c99 -pedantic + return error.SkipZigTest; + } + if ((builtin.zig_backend == .stage2_llvm or builtin.zig_backend == .stage2_c) and builtin.cpu.arch == .aarch64) { diff --git a/test/tests.zig b/test/tests.zig index 490222cb6f..02eca3ed19 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -988,18 +988,59 @@ pub fn addModuleTests(b: *std.Build, options: ModuleTestOptions) *Step { these_tests.overrideZigLibDir("lib"); these_tests.addIncludePath("test"); - const run = b.addRunArtifact(these_tests); - run.skip_foreign_checks = true; - run.setName(b.fmt("run test {s}-{s}-{s}{s}{s}{s}", .{ + const qualified_name = b.fmt("{s}-{s}-{s}{s}{s}{s}", .{ options.name, triple_txt, @tagName(test_target.optimize_mode), libc_suffix, single_threaded_suffix, backend_suffix, - })); + }); - step.dependOn(&run.step); + if (test_target.target.ofmt == std.Target.ObjectFormat.c) { + var altered_target = test_target.target; + altered_target.ofmt = null; + + const compile_c = b.addExecutable(.{ + .name = qualified_name, + .link_libc = test_target.link_libc, + .target = altered_target, + }); + compile_c.overrideZigLibDir("lib"); + compile_c.addCSourceFileSource(.{ + .source = these_tests.getOutputSource(), + .args = &.{ + // TODO output -std=c89 compatible C code + "-std=c99", + "-pedantic", + "-Werror", + // TODO stop violating these pedantic errors + "-Wno-address-of-packed-member", + "-Wno-gnu-folding-constant", + "-Wno-incompatible-pointer-types", + "-Wno-overlength-strings", + }, + }); + compile_c.addIncludePath("lib"); // for zig.h + if (test_target.link_libc == false and test_target.target.getOsTag() == .windows) { + compile_c.subsystem = .Console; + compile_c.linkSystemLibrary("kernel32"); + compile_c.linkSystemLibrary("ntdll"); + } + + const run = b.addRunArtifact(compile_c); + run.skip_foreign_checks = true; + run.enableTestRunnerMode(); + run.setName(b.fmt("run test {s}", .{qualified_name})); + + step.dependOn(&run.step); + } else { + const run = b.addRunArtifact(these_tests); + run.skip_foreign_checks = true; + run.setName(b.fmt("run test {s}", .{qualified_name})); + + step.dependOn(&run.step); + } } return step; }