diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2025-02-05 19:53:12 +0000 |
|---|---|---|
| committer | mlugg <mlugg@mlugg.co.uk> | 2025-02-05 19:53:12 +0000 |
| commit | fbe0ae4fd4128a3652071b4b5985d68ae56e9992 (patch) | |
| tree | a122df94fa0b93d6c0b4c28bf5d5ae9d9385d282 | |
| parent | 0f38558435a0f73c4c025b5641bd8e531f063e0c (diff) | |
| download | zig-fbe0ae4fd4128a3652071b4b5985d68ae56e9992.tar.gz zig-fbe0ae4fd4128a3652071b4b5985d68ae56e9992.zip | |
Sema: fix PTR of slice of sentinel-terminated array
Resolves: #20901
| -rw-r--r-- | src/Sema.zig | 4 | ||||
| -rw-r--r-- | test/behavior/cast.zig | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 7b8999a211..97e90da92e 100644 --- a/src/Sema.zig +++ b/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; diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 8c2be13923..a90519379e 100644 --- a/test/behavior/cast.zig +++ b/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); +} |
