Commit 7c56145a76

Andrew Kelley <andrew@ziglang.org>
2023-04-24 00:26:57
add behavior test for `@memset` on slices
and avoid new language feature in std.ArrayList for now, until x86_64 self-hosted backend can implement it.
1 parent 482a0f6
Changed files (2)
lib
test
behavior
lib/std/array_list.zig
@@ -121,7 +121,13 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type {
 
             const new_memory = try allocator.alignedAlloc(T, alignment, self.items.len);
             mem.copy(T, new_memory, self.items);
-            @memset(self.items, undefined);
+
+            // TODO: write like this instead:
+            //@memset(self.items, undefined);
+            // first we need to implement memset with element ABI size > 1 in
+            // the x86_64 selfhosted backend.
+            @memset(@ptrCast([*]u8, self.items.ptr)[0..self.items.len * @sizeOf(T)], undefined);
+
             self.clearAndFree();
             return new_memory;
         }
@@ -597,7 +603,13 @@ pub fn ArrayListAlignedUnmanaged(comptime T: type, comptime alignment: ?u29) typ
 
             const new_memory = try allocator.alignedAlloc(T, alignment, self.items.len);
             mem.copy(T, new_memory, self.items);
-            @memset(self.items, undefined);
+
+            // TODO: write like this instead:
+            //@memset(self.items, undefined);
+            // first we need to implement memset with element ABI size > 1 in
+            // the x86_64 selfhosted backend.
+            @memset(@ptrCast([*]u8, self.items.ptr)[0..self.items.len * @sizeOf(T)], undefined);
+
             self.clearAndFree(allocator);
             return new_memory;
         }
test/behavior/basic.zig
@@ -357,6 +357,14 @@ test "@memset on array pointers" {
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_wasm) {
+        // TODO: implement memset when element ABI size > 1
+        return error.SkipZigTest;
+    }
+    if (builtin.zig_backend == .stage2_x86_64) {
+        // TODO: implement memset when element ABI size > 1
+        return error.SkipZigTest;
+    }
 
     try testMemsetArray();
     try comptime testMemsetArray();
@@ -381,6 +389,48 @@ fn testMemsetArray() !void {
     }
 }
 
+test "@memset on slices" {
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_wasm) {
+        // TODO: implement memset when element ABI size > 1
+        // TODO: implement memset on slices
+        return error.SkipZigTest;
+    }
+    if (builtin.zig_backend == .stage2_x86_64) {
+        // TODO: implement memset when element ABI size > 1
+        // TODO: implement memset on slices
+        return error.SkipZigTest;
+    }
+
+    try testMemsetSlice();
+    try comptime testMemsetSlice();
+}
+
+fn testMemsetSlice() !void {
+    {
+        // memset slice to non-undefined, ABI size == 1
+        var array: [20]u8 = undefined;
+        var len = array.len;
+        var slice = array[0..len];
+        @memset(slice, 'A');
+        try expect(slice[0] == 'A');
+        try expect(slice[11] == 'A');
+        try expect(slice[19] == 'A');
+    }
+    {
+        // memset slice to non-undefined, ABI size > 1
+        var array: [20]u32 = undefined;
+        var len = array.len;
+        var slice = array[0..len];
+        @memset(slice, 1234);
+        try expect(slice[0] == 1234);
+        try expect(slice[11] == 1234);
+        try expect(slice[19] == 1234);
+    }
+}
+
 test "memcpy and memset intrinsics" {
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;