Commit 45e9617720

mlugg <mlugg@mlugg.co.uk>
2023-06-15 02:04:22
Sema: don't assume slice value is interned when loading from comptime pointer
Resolves: #16030
1 parent b975701
Changed files (2)
src
test
behavior
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,
                     };
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);
+}