| author | |
| committer | |
| log | 828756ceebaed09a90da81a5fc9a492443e2e8bb |
| tree | c5d2ca56e670558e96fbcc6d9020ef61d7f2ea4e |
| parent | 08ae212772c38d6149464274edc07282e5418570 |
3 files changed, 13 insertions(+), 9 deletions(-)
src/Sema.zig+6-2| ... | @@ -28508,7 +28508,11 @@ fn beginComptimePtrLoad( | ... | @@ -28508,7 +28508,11 @@ fn beginComptimePtrLoad( |
| 28508 | .int => return error.RuntimeLoad, | 28508 | .int => return error.RuntimeLoad, |
| 28509 | .eu_payload, .opt_payload => |container_ptr| blk: { | 28509 | .eu_payload, .opt_payload => |container_ptr| blk: { |
| 28510 | const container_ty = mod.intern_pool.typeOf(container_ptr).toType().childType(mod); | 28510 | const container_ty = mod.intern_pool.typeOf(container_ptr).toType().childType(mod); |
| 28511 | const payload_ty = ptr.ty.toType().childType(mod); | 28511 | const payload_ty = switch (ptr.addr) { |
| 28512 | .eu_payload => container_ty.errorUnionPayload(mod), | ||
| 28513 | .opt_payload => container_ty.optionalChild(mod), | ||
| 28514 | else => unreachable, | ||
| 28515 | }; | ||
| 28512 | var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty); | 28516 | var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty); |
| 28513 | 28517 | ||
| 28514 | // eu_payload and opt_payload never have a well-defined layout | 28518 | // eu_payload and opt_payload never have a well-defined layout |
| ... | @@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad( | ... | @@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad( |
| 28554 | }; | 28558 | }; |
| 28555 | }, | 28559 | }, |
| 28556 | .elem => |elem_ptr| blk: { | 28560 | .elem => |elem_ptr| blk: { |
| 28557 | const elem_ty = ptr.ty.toType().elemType2(mod); | 28561 | const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod); |
| 28558 | var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null); | 28562 | var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null); |
| 28559 | 28563 | ||
| 28560 | // This code assumes that elem_ptrs have been "flattened" in order for direct dereference | 28564 | // This code assumes that elem_ptrs have been "flattened" in order for direct dereference |
src/codegen/llvm.zig+2-1| ... | @@ -3915,7 +3915,8 @@ pub const DeclGen = struct { | ... | @@ -3915,7 +3915,8 @@ pub const DeclGen = struct { |
| 3915 | const indices: [1]*llvm.Value = .{ | 3915 | const indices: [1]*llvm.Value = .{ |
| 3916 | llvm_usize.constInt(elem_ptr.index, .False), | 3916 | llvm_usize.constInt(elem_ptr.index, .False), |
| 3917 | }; | 3917 | }; |
| 3918 | const elem_llvm_ty = try dg.lowerType(ptr.ty.toType().elemType2(mod)); | 3918 | const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod); |
| 3919 | const elem_llvm_ty = try dg.lowerType(elem_ty); | ||
| 3919 | return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len); | 3920 | return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len); |
| 3920 | }, | 3921 | }, |
| 3921 | .field => |field_ptr| { | 3922 | .field => |field_ptr| { |
src/value.zig+5-6| ... | @@ -625,15 +625,14 @@ pub const Value = struct { | ... | @@ -625,15 +625,14 @@ pub const Value = struct { |
| 625 | .int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema), | 625 | .int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema), |
| 626 | .elem => |elem| { | 626 | .elem => |elem| { |
| 627 | const base_addr = (try elem.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null; | 627 | const base_addr = (try elem.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null; |
| 628 | const elem_size = ptr.ty.toType().elemType2(mod).abiSize(mod); | 628 | const elem_ty = mod.intern_pool.typeOf(elem.base).toType().elemType2(mod); |
| 629 | return base_addr + elem.index * elem_size; | 629 | return base_addr + elem.index * elem_ty.abiSize(mod); |
| 630 | }, | 630 | }, |
| 631 | .field => |field| { | 631 | .field => |field| { |
| 632 | const struct_ty = ptr.ty.toType().childType(mod); | ||
| 633 | if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty); | ||
| 634 | const base_addr = (try field.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null; | 632 | const base_addr = (try field.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null; |
| 635 | const field_offset = ptr.ty.toType().childType(mod).structFieldOffset(field.index, mod); | 633 | const struct_ty = mod.intern_pool.typeOf(field.base).toType().childType(mod); |
| 636 | return base_addr + field_offset; | 634 | if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty); |
| 635 | return base_addr + struct_ty.structFieldOffset(field.index, mod); | ||
| 637 | }, | 636 | }, |
| 638 | else => null, | 637 | else => null, |
| 639 | }, | 638 | }, |