authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-06-15 01:04:22+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-06-15 01:23:52+01:00
log45e961772050191ce94becc53dcb86971a5804ab
tree72e1bbe704eb65108f43b8b9f6a7d16d4451815d
parentb975701a4d98f2bf124fd4e66ca57e337827ec5a
signaturelock-open Commit is signed but in an unrecognized format.

Sema: don't assume slice value is interned when loading from comptime pointer

Resolves: #16030

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

src/Sema.zig+1-1
...@@ -29265,7 +29265,7 @@ fn beginComptimePtrLoad(...@@ -29265,7 +29265,7 @@ fn beginComptimePtrLoad(
29265 },29265 },
29266 Value.slice_len_index => TypedValue{29266 Value.slice_len_index => TypedValue{
29267 .ty = Type.usize,29267 .ty = Type.usize,
29268 .val = mod.intern_pool.indexToKey(tv.val.toIntern()).ptr.len.toValue(),29268 .val = mod.intern_pool.indexToKey(try tv.val.intern(tv.ty, mod)).ptr.len.toValue(),
29269 },29269 },
29270 else => unreachable,29270 else => unreachable,
29271 };29271 };
test/behavior/slice.zig+17
...@@ -869,3 +869,20 @@ test "write through pointer to optional slice arg" {...@@ -869,3 +869,20 @@ test "write through pointer to optional slice arg" {
869 try S.bar(&foo);869 try S.bar(&foo);
870 try expectEqualStrings(foo.?, "ok");870 try expectEqualStrings(foo.?, "ok");
871}871}
872
873test "modify slice length at comptime" {
874 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
875 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
876 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
877 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
878
879 const arr: [2]u8 = .{ 10, 20 };
880 comptime var s: []const u8 = arr[0..0];
881 s.len += 1;
882 const a = s;
883 s.len += 1;
884 const b = s;
885
886 try expectEqualSlices(u8, &.{10}, a);
887 try expectEqualSlices(u8, &.{ 10, 20 }, b);
888}