diff --git a/src/Sema.zig b/src/Sema.zig index be531af60f..0cc657ba01 100644 --- a/src/Sema.zig +++ b/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 diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 5da91e5573..9d96ea457f 100644 --- a/src/codegen/llvm.zig +++ b/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| { diff --git a/src/value.zig b/src/value.zig index aba0af176e..c7a2a54458 100644 --- a/src/value.zig +++ b/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, },