| ... | ... | @@ -1472,12 +1472,12 @@ pub const DeclGen = struct { |
| 1472 | 1472 | return llvm_int.constIntToPtr(try dg.llvmType(tv.ty)); |
| 1473 | 1473 | }, |
| 1474 | 1474 | .field_ptr, .opt_payload_ptr, .eu_payload_ptr => { |
| 1475 | | const parent = try dg.lowerParentPtr(tv.val); |
| 1475 | const parent = try dg.lowerParentPtr(tv.val, tv.ty); |
| 1476 | 1476 | return parent.llvm_ptr.constBitCast(try dg.llvmType(tv.ty)); |
| 1477 | 1477 | }, |
| 1478 | 1478 | .elem_ptr => { |
| 1479 | 1479 | const elem_ptr = tv.val.castTag(.elem_ptr).?.data; |
| 1480 | | const parent = try dg.lowerParentPtr(elem_ptr.array_ptr); |
| 1480 | const parent = try dg.lowerParentPtr(elem_ptr.array_ptr, tv.ty); |
| 1481 | 1481 | const llvm_usize = try dg.llvmType(Type.usize); |
| 1482 | 1482 | if (parent.llvm_ptr.typeOf().getElementType().getTypeKind() == .Array) { |
| 1483 | 1483 | const indices: [2]*const llvm.Value = .{ |
| ... | ... | @@ -2683,7 +2683,7 @@ pub const DeclGen = struct { |
| 2683 | 2683 | }; |
| 2684 | 2684 | } |
| 2685 | 2685 | |
| 2686 | | fn lowerParentPtr(dg: *DeclGen, ptr_val: Value) Error!ParentPtr { |
| 2686 | fn lowerParentPtr(dg: *DeclGen, ptr_val: Value, base_ty: Type) Error!ParentPtr { |
| 2687 | 2687 | switch (ptr_val.tag()) { |
| 2688 | 2688 | .decl_ref_mut => { |
| 2689 | 2689 | const decl = ptr_val.castTag(.decl_ref_mut).?.data.decl; |
| ... | ... | @@ -2697,9 +2697,27 @@ pub const DeclGen = struct { |
| 2697 | 2697 | const decl = ptr_val.castTag(.variable).?.data.owner_decl; |
| 2698 | 2698 | return dg.lowerParentPtrDecl(ptr_val, decl); |
| 2699 | 2699 | }, |
| 2700 | .int_i64 => { |
| 2701 | const int = ptr_val.castTag(.int_i64).?.data; |
| 2702 | const llvm_usize = try dg.llvmType(Type.usize); |
| 2703 | const llvm_int = llvm_usize.constInt(@bitCast(u64, int), .False); |
| 2704 | return ParentPtr{ |
| 2705 | .llvm_ptr = llvm_int.constIntToPtr(try dg.llvmType(base_ty)), |
| 2706 | .ty = base_ty, |
| 2707 | }; |
| 2708 | }, |
| 2709 | .int_u64 => { |
| 2710 | const int = ptr_val.castTag(.int_u64).?.data; |
| 2711 | const llvm_usize = try dg.llvmType(Type.usize); |
| 2712 | const llvm_int = llvm_usize.constInt(int, .False); |
| 2713 | return ParentPtr{ |
| 2714 | .llvm_ptr = llvm_int.constIntToPtr(try dg.llvmType(base_ty)), |
| 2715 | .ty = base_ty, |
| 2716 | }; |
| 2717 | }, |
| 2700 | 2718 | .field_ptr => { |
| 2701 | 2719 | const field_ptr = ptr_val.castTag(.field_ptr).?.data; |
| 2702 | | const parent = try dg.lowerParentPtr(field_ptr.container_ptr); |
| 2720 | const parent = try dg.lowerParentPtr(field_ptr.container_ptr, base_ty); |
| 2703 | 2721 | const field_index = @intCast(u32, field_ptr.field_index); |
| 2704 | 2722 | const llvm_u32 = dg.context.intType(32); |
| 2705 | 2723 | const target = dg.module.getTarget(); |
| ... | ... | @@ -2753,7 +2771,7 @@ pub const DeclGen = struct { |
| 2753 | 2771 | }, |
| 2754 | 2772 | .elem_ptr => { |
| 2755 | 2773 | const elem_ptr = ptr_val.castTag(.elem_ptr).?.data; |
| 2756 | | const parent = try dg.lowerParentPtr(elem_ptr.array_ptr); |
| 2774 | const parent = try dg.lowerParentPtr(elem_ptr.array_ptr, base_ty); |
| 2757 | 2775 | const llvm_usize = try dg.llvmType(Type.usize); |
| 2758 | 2776 | const indices: [2]*const llvm.Value = .{ |
| 2759 | 2777 | llvm_usize.constInt(0, .False), |
| ... | ... | @@ -2766,7 +2784,7 @@ pub const DeclGen = struct { |
| 2766 | 2784 | }, |
| 2767 | 2785 | .opt_payload_ptr => { |
| 2768 | 2786 | const opt_payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 2769 | | const parent = try dg.lowerParentPtr(opt_payload_ptr); |
| 2787 | const parent = try dg.lowerParentPtr(opt_payload_ptr, base_ty); |
| 2770 | 2788 | var buf: Type.Payload.ElemType = undefined; |
| 2771 | 2789 | const payload_ty = parent.ty.optionalChild(&buf); |
| 2772 | 2790 | if (!payload_ty.hasRuntimeBits() or parent.ty.isPtrLikeOptional()) { |
| ... | ... | @@ -2790,7 +2808,7 @@ pub const DeclGen = struct { |
| 2790 | 2808 | }, |
| 2791 | 2809 | .eu_payload_ptr => { |
| 2792 | 2810 | const eu_payload_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 2793 | | const parent = try dg.lowerParentPtr(eu_payload_ptr); |
| 2811 | const parent = try dg.lowerParentPtr(eu_payload_ptr, base_ty); |
| 2794 | 2812 | const payload_ty = parent.ty.errorUnionPayload(); |
| 2795 | 2813 | if (!payload_ty.hasRuntimeBits()) { |
| 2796 | 2814 | // In this case, we represent pointer to error union the same as pointer |