authorgravatar for pentuppup@noreply.codeberg.orgpentuppup <pentuppup@noreply.codeberg.org> 2026-07-17 19:52:36-04:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-10 09:12:56+02:00
loge2636e8c868f472a4b7a2b4a0d1386f1560fda80
tree13ae0e8e63fe9f37b5b5d3945eba285d28f51c35
parent584b82d4ffcb72e58a8caff68e6251050b99a955
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

AstGen: give result type to slice by length sentinel


2 files changed, 12 insertions(+), 1 deletions(-)

lib/std/zig/AstGen.zig+4-1
......@@ -880,7 +880,10 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
880880 const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, lhs_extra.start);
881881 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
882882 const len = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, full.ast.end.unwrap().?);
883 const sentinel = if (full.ast.sentinel.unwrap()) |sentinel| try expr(gz, scope, .{ .rl = .none }, sentinel) else .none;
883 const sentinel = if (full.ast.sentinel.unwrap()) |sentinel| s: {
884 const sentinel_ty = try gz.addUnNode(.slice_sentinel_ty, lhs, node);
885 break :s try expr(gz, scope, .{ .rl = .{ .coerced_ty = sentinel_ty } }, sentinel);
886 } else .none;
884887 try emitDbgStmt(gz, cursor);
885888 const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{
886889 .lhs = lhs,
test/behavior/slice.zig+8
......@@ -1090,6 +1090,14 @@ test "sentinel expression in slice operation has result type" {
10901090 comptime assert(slice.len == 2);
10911091 comptime assert(slice[0] == 1);
10921092 comptime assert(slice[1] == 2);
1093
1094 const by_len = arr[0..][0..2 :@intCast(sentinel)];
1095
1096 comptime assert(@TypeOf(by_len) == *const [2:sentinel]u16);
1097 comptime assert(by_len[2] == sentinel);
1098 comptime assert(by_len.len == 2);
1099 comptime assert(by_len[0] == 1);
1100 comptime assert(by_len[1] == 2);
10931101}
10941102
10951103test "conditionally return second argument slice" {