diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 5b32f23f278cdb5f6ecc4a30c390208db62497a4..fd6e48314901787bedbf74ba8118af6b7b09de36 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -880,7 +880,10 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, lhs_extra.start); const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); const len = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, full.ast.end.unwrap().?); - const sentinel = if (full.ast.sentinel.unwrap()) |sentinel| try expr(gz, scope, .{ .rl = .none }, sentinel) else .none; + const sentinel = if (full.ast.sentinel.unwrap()) |sentinel| s: { + const sentinel_ty = try gz.addUnNode(.slice_sentinel_ty, lhs, node); + break :s try expr(gz, scope, .{ .rl = .{ .coerced_ty = sentinel_ty } }, sentinel); + } else .none; try emitDbgStmt(gz, cursor); const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{ .lhs = lhs, diff --git a/test/behavior/slice.zig b/test/behavior/slice.zig index e4d7e9d1a75b4e0026b68f403ae649a7bd8a0d86..b1feb5433000f68a3d54c4e4555bb07cfa75f5dd 100644 --- a/test/behavior/slice.zig +++ b/test/behavior/slice.zig @@ -1090,6 +1090,14 @@ test "sentinel expression in slice operation has result type" { comptime assert(slice.len == 2); comptime assert(slice[0] == 1); comptime assert(slice[1] == 2); + + const by_len = arr[0..][0..2 :@intCast(sentinel)]; + + comptime assert(@TypeOf(by_len) == *const [2:sentinel]u16); + comptime assert(by_len[2] == sentinel); + comptime assert(by_len.len == 2); + comptime assert(by_len[0] == 1); + comptime assert(by_len[1] == 2); } test "conditionally return second argument slice" {