diff --git a/src/Sema.zig b/src/Sema.zig index f703c6154c..c4dba205a3 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -29265,7 +29265,7 @@ fn beginComptimePtrLoad( }, Value.slice_len_index => TypedValue{ .ty = Type.usize, - .val = mod.intern_pool.indexToKey(tv.val.toIntern()).ptr.len.toValue(), + .val = mod.intern_pool.indexToKey(try tv.val.intern(tv.ty, mod)).ptr.len.toValue(), }, else => unreachable, }; diff --git a/test/behavior/slice.zig b/test/behavior/slice.zig index fb9d1e047a..79990feba4 100644 --- a/test/behavior/slice.zig +++ b/test/behavior/slice.zig @@ -869,3 +869,20 @@ test "write through pointer to optional slice arg" { try S.bar(&foo); try expectEqualStrings(foo.?, "ok"); } + +test "modify slice length at comptime" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const arr: [2]u8 = .{ 10, 20 }; + comptime var s: []const u8 = arr[0..0]; + s.len += 1; + const a = s; + s.len += 1; + const b = s; + + try expectEqualSlices(u8, &.{10}, a); + try expectEqualSlices(u8, &.{ 10, 20 }, b); +}