authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-09-16 13:10:56+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-09-23 13:51:18+01:00
log05f78adeaf7685e6107da7c3533b233ce19a54b8
treee96dad0867d0d747878ba287adc1d02c0f1e70a4
parent644041b3a492558592e1306d2214c9e6b25de53b

Sema: don't attempt to reinterpret comptime-only types when mutating comptime memory

I have no idea how correct this code is, but I'm working on a full rewrite of this logic anyway, and this certainly seems more correct than before.

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

src/Sema.zig+7-2
......@@ -29922,8 +29922,13 @@ fn beginComptimePtrMutation(
2992229922 // We might have a pointer to multiple elements of the array (e.g. a pointer
2992329923 // to a sub-array). In this case, we just have to reinterpret the relevant
2992429924 // bytes of the whole array rather than any single element.
29925 const elem_abi_size_u64 = try sema.typeAbiSize(base_elem_ty);
29926 if (elem_abi_size_u64 < try sema.typeAbiSize(ptr_elem_ty)) {
29925 reinterp_multi_elem: {
29926 if (try sema.typeRequiresComptime(base_elem_ty)) break :reinterp_multi_elem;
29927 if (try sema.typeRequiresComptime(ptr_elem_ty)) break :reinterp_multi_elem;
29928
29929 const elem_abi_size_u64 = try sema.typeAbiSize(base_elem_ty);
29930 if (elem_abi_size_u64 >= try sema.typeAbiSize(ptr_elem_ty)) break :reinterp_multi_elem;
29931
2992729932 const elem_abi_size = try sema.usizeCast(block, src, elem_abi_size_u64);
2992829933 const elem_idx = try sema.usizeCast(block, src, elem_ptr.index);
2992929934 return .{