aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/meta.zig15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/std/meta.zig b/lib/std/meta.zig
index 85eb6cd4d3..676d7423c6 100644
--- a/lib/std/meta.zig
+++ b/lib/std/meta.zig
@@ -1203,6 +1203,14 @@ pub inline fn hasUniqueRepresentation(comptime T: type) bool {
.Pointer => |info| info.size != .Slice,
+ .Optional => |info| switch (@typeInfo(info.child)) {
+ .Pointer => |ptr| !ptr.is_allowzero and switch (ptr.size) {
+ .Slice, .C => false,
+ .One, .Many => true,
+ },
+ else => false,
+ },
+
.Array => |info| hasUniqueRepresentation(info.child),
.Struct => |info| {
@@ -1301,8 +1309,15 @@ test hasUniqueRepresentation {
try testing.expect(!hasUniqueRepresentation(T));
}
+ try testing.expect(hasUniqueRepresentation(*u8));
+ try testing.expect(hasUniqueRepresentation(*const u8));
+ try testing.expect(hasUniqueRepresentation(?*u8));
+ try testing.expect(hasUniqueRepresentation(?*const u8));
+
try testing.expect(!hasUniqueRepresentation([]u8));
try testing.expect(!hasUniqueRepresentation([]const u8));
+ try testing.expect(!hasUniqueRepresentation(?[]u8));
+ try testing.expect(!hasUniqueRepresentation(?[]const u8));
try testing.expect(hasUniqueRepresentation(@Vector(std.simd.suggestVectorLength(u8) orelse 1, u8)));
try testing.expect(@sizeOf(@Vector(3, u8)) == 3 or !hasUniqueRepresentation(@Vector(3, u8)));