Commit fbe0ae4fd4

mlugg <mlugg@mlugg.co.uk>
2025-02-05 20:53:12
Sema: fix PTR of slice of sentinel-terminated array
Resolves: #20901
1 parent 0f38558
Changed files (2)
src
test
behavior
src/Sema.zig
@@ -34603,14 +34603,14 @@ fn resolvePeerTypesInner(
                     }
                     // Clear existing sentinel
                     ptr_info.sentinel = .none;
-                    switch (ip.indexToKey(ptr_info.child)) {
+                    if (ptr_info.flags.size == .one) switch (ip.indexToKey(ptr_info.child)) {
                         .array_type => |array_type| ptr_info.child = (try pt.arrayType(.{
                             .len = array_type.len,
                             .child = array_type.child,
                             .sentinel = .none,
                         })).toIntern(),
                         else => {},
-                    }
+                    };
                 }
 
                 opt_ptr_info = ptr_info;
test/behavior/cast.zig
@@ -2649,3 +2649,19 @@ test "bitcast vector" {
     const bigsum: u32x8 = @bitCast(zerox32);
     try std.testing.expectEqual(0, @reduce(.Add, bigsum));
 }
+
+test "peer type resolution: slice of sentinel-terminated array" {
+    var f: bool = undefined;
+    f = false;
+
+    const a: [][2:0]u8 = &.{};
+    const b: []const [2:0]u8 = &.{.{ 10, 20 }};
+
+    const result = if (f) a else b;
+
+    comptime assert(@TypeOf(result) == []const [2:0]u8);
+    try expect(result.len == 1);
+    try expect(result[0].len == 2);
+    try expect(result[0][0] == 10);
+    try expect(result[0][1] == 20);
+}