diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 1dfcab5d6180c72a840a4d6b76885a1e12c98814..92d973fb4f0f56faf6af561f90b8bb02949d33b1 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1583,7 +1583,7 @@ fn airStoreUndefined(f: *Function, dest_ptr: CValue, dest_type: Type) !CValue { try writer.writeAll("));\n"); }, else => { - const indirection = if (dest_type.zigTypeTag() == .Array) "" else "*"; + const indirection = if (dest_type.childType().zigTypeTag() == .Array) "" else "*"; try writer.writeAll("memset("); try f.writeCValue(writer, dest_ptr); @@ -1608,7 +1608,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue { return try airStoreUndefined(f, dest_ptr, lhs_type); // Don't check this for airStoreUndefined as that will work for arrays already - if (lhs_type.zigTypeTag() == .Array) + if (lhs_type.childType().zigTypeTag() == .Array) return f.fail("TODO: C backend: implement airStore for arrays", .{}); const writer = f.object.writer(); diff --git a/test/behavior/cast_c.zig b/test/behavior/cast_c.zig index e634103d42e098727db9bc8bcc5fa6c426c9e986..0e74cd0b58965e19e29f5b5705ab3d63ddd8c749 100644 --- a/test/behavior/cast_c.zig +++ b/test/behavior/cast_c.zig @@ -247,3 +247,14 @@ test "*const ?[*]const T to [*c]const [*c]const T" { try expect(b.*[0] == 'o'); try expect(b[0][1] == 'k'); } + +test "array coersion to undefined at runtime" { + @setRuntimeSafety(true); + + var array = [4]u8{ 3, 4, 5, 6 }; + var undefined_val = [4]u8{ 0xAA, 0xAA, 0xAA, 0xAA }; + + try expect(std.mem.eql(u8, &array, &array)); + array = undefined; + try expect(std.mem.eql(u8, &array, &undefined_val)); +}