Commit 828756ceeb
src/codegen/llvm.zig
@@ -3915,7 +3915,8 @@ pub const DeclGen = struct {
const indices: [1]*llvm.Value = .{
llvm_usize.constInt(elem_ptr.index, .False),
};
- const elem_llvm_ty = try dg.lowerType(ptr.ty.toType().elemType2(mod));
+ const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod);
+ const elem_llvm_ty = try dg.lowerType(elem_ty);
return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len);
},
.field => |field_ptr| {
src/Sema.zig
@@ -28508,7 +28508,11 @@ fn beginComptimePtrLoad(
.int => return error.RuntimeLoad,
.eu_payload, .opt_payload => |container_ptr| blk: {
const container_ty = mod.intern_pool.typeOf(container_ptr).toType().childType(mod);
- const payload_ty = ptr.ty.toType().childType(mod);
+ const payload_ty = switch (ptr.addr) {
+ .eu_payload => container_ty.errorUnionPayload(mod),
+ .opt_payload => container_ty.optionalChild(mod),
+ else => unreachable,
+ };
var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty);
// eu_payload and opt_payload never have a well-defined layout
@@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad(
};
},
.elem => |elem_ptr| blk: {
- const elem_ty = ptr.ty.toType().elemType2(mod);
+ const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod);
var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null);
// This code assumes that elem_ptrs have been "flattened" in order for direct dereference
src/value.zig
@@ -625,15 +625,14 @@ pub const Value = struct {
.int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema),
.elem => |elem| {
const base_addr = (try elem.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;
- const elem_size = ptr.ty.toType().elemType2(mod).abiSize(mod);
- return base_addr + elem.index * elem_size;
+ const elem_ty = mod.intern_pool.typeOf(elem.base).toType().elemType2(mod);
+ return base_addr + elem.index * elem_ty.abiSize(mod);
},
.field => |field| {
- const struct_ty = ptr.ty.toType().childType(mod);
- if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
const base_addr = (try field.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;
- const field_offset = ptr.ty.toType().childType(mod).structFieldOffset(field.index, mod);
- return base_addr + field_offset;
+ const struct_ty = mod.intern_pool.typeOf(field.base).toType().childType(mod);
+ if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
+ return base_addr + struct_ty.structFieldOffset(field.index, mod);
},
else => null,
},