diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-25 07:08:48 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-10 20:47:55 -0700 |
| commit | 72e4ea38216aab7e7ed05978d04c5d32de44b5ce (patch) | |
| tree | 9b11f31d39590a767d420dd036682438a6ede634 /src/value.zig | |
| parent | 1a4626d2cf8b9985833f97b6fea6ea03011ada4e (diff) | |
| download | zig-72e4ea38216aab7e7ed05978d04c5d32de44b5ce.tar.gz zig-72e4ea38216aab7e7ed05978d04c5d32de44b5ce.zip | |
InternPool: fix crashes up to in progress comptime mutation
Diffstat (limited to 'src/value.zig')
| -rw-r--r-- | src/value.zig | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/value.zig b/src/value.zig index ef3a3f6be1..02f4422dda 100644 --- a/src/value.zig +++ b/src/value.zig @@ -1961,12 +1961,31 @@ pub const Value = struct { mod: *Module, ) Allocator.Error!Value { const elem_ty = ty.elemType2(mod); + const ptr_ty_key = mod.intern_pool.indexToKey(ty.toIntern()).ptr_type; + assert(ptr_ty_key.host_size == 0); + assert(ptr_ty_key.bit_offset == 0); + assert(ptr_ty_key.vector_index == .none); + const elem_alignment = InternPool.Alignment.fromByteUnits(elem_ty.abiAlignment(mod)); + const alignment = switch (ptr_ty_key.alignment) { + .none => .none, + else => ptr_ty_key.alignment.min( + @intToEnum(InternPool.Alignment, @ctz(index * elem_ty.abiSize(mod))), + ), + }; + const ptr_ty = try mod.ptrType(.{ + .elem_type = elem_ty.toIntern(), + .alignment = if (alignment == elem_alignment) .none else alignment, + .is_const = ptr_ty_key.is_const, + .is_volatile = ptr_ty_key.is_volatile, + .is_allowzero = ptr_ty_key.is_allowzero, + .address_space = ptr_ty_key.address_space, + }); const ptr_val = switch (mod.intern_pool.indexToKey(val.toIntern())) { .ptr => |ptr| ptr: { switch (ptr.addr) { .elem => |elem| if (mod.intern_pool.typeOf(elem.base).toType().elemType2(mod).eql(elem_ty, mod)) return (try mod.intern(.{ .ptr = .{ - .ty = ty.toIntern(), + .ty = ptr_ty.toIntern(), .addr = .{ .elem = .{ .base = elem.base, .index = elem.index + index, @@ -1982,7 +2001,7 @@ pub const Value = struct { else => val, }; return (try mod.intern(.{ .ptr = .{ - .ty = ty.toIntern(), + .ty = ptr_ty.toIntern(), .addr = .{ .elem = .{ .base = ptr_val.toIntern(), .index = index, |
