| ... | ... | @@ -3672,10 +3672,18 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 3672 | 3672 | implicit_ct: { |
| 3673 | 3673 | const ptr_val = try sema.resolveMaybeUndefVal(alloc) orelse break :implicit_ct; |
| 3674 | 3674 | if (!ptr_val.isComptimeMutablePtr(mod)) { |
| 3675 | | // It could still be a constant pointer to a decl |
| 3676 | | const decl_index = ptr_val.pointerDecl(mod) orelse break :implicit_ct; |
| 3677 | | const decl_val = mod.declPtr(decl_index).val.toIntern(); |
| 3678 | | if (mod.intern_pool.isRuntimeValue(decl_val)) break :implicit_ct; |
| 3675 | // It could still be a constant pointer to a decl. |
| 3676 | switch (mod.intern_pool.indexToKey(ptr_val.toIntern()).ptr.addr) { |
| 3677 | .anon_decl => |anon_decl| { |
| 3678 | if (mod.intern_pool.isVariable(anon_decl.val)) |
| 3679 | break :implicit_ct; |
| 3680 | }, |
| 3681 | else => { |
| 3682 | const decl_index = ptr_val.pointerDecl(mod) orelse break :implicit_ct; |
| 3683 | const decl_val = mod.declPtr(decl_index).val.toIntern(); |
| 3684 | if (mod.intern_pool.isRuntimeValue(decl_val)) break :implicit_ct; |
| 3685 | }, |
| 3686 | } |
| 3679 | 3687 | } |
| 3680 | 3688 | return sema.makePtrConst(block, alloc); |
| 3681 | 3689 | } |
| ... | ... | @@ -3915,17 +3923,19 @@ fn finishResolveComptimeKnownAllocValue(sema: *Sema, result_val: InternPool.Inde |
| 3915 | 3923 | return result_val; |
| 3916 | 3924 | } |
| 3917 | 3925 | |
| 3926 | fn makePtrTyConst(sema: *Sema, ptr_ty: Type) CompileError!Type { |
| 3927 | var ptr_info = ptr_ty.ptrInfo(sema.mod); |
| 3928 | ptr_info.flags.is_const = true; |
| 3929 | return sema.ptrType(ptr_info); |
| 3930 | } |
| 3931 | |
| 3918 | 3932 | fn makePtrConst(sema: *Sema, block: *Block, alloc: Air.Inst.Ref) CompileError!Air.Inst.Ref { |
| 3919 | | const mod = sema.mod; |
| 3920 | 3933 | const alloc_ty = sema.typeOf(alloc); |
| 3921 | | |
| 3922 | | var ptr_info = alloc_ty.ptrInfo(mod); |
| 3923 | | ptr_info.flags.is_const = true; |
| 3924 | | const const_ptr_ty = try sema.ptrType(ptr_info); |
| 3934 | const const_ptr_ty = try sema.makePtrTyConst(alloc_ty); |
| 3925 | 3935 | |
| 3926 | 3936 | // Detect if a comptime value simply needs to have its type changed. |
| 3927 | 3937 | if (try sema.resolveMaybeUndefVal(alloc)) |val| { |
| 3928 | | return Air.internedToRef((try mod.getCoerced(val, const_ptr_ty)).toIntern()); |
| 3938 | return Air.internedToRef((try sema.mod.getCoerced(val, const_ptr_ty)).toIntern()); |
| 3929 | 3939 | } |
| 3930 | 3940 | |
| 3931 | 3941 | return block.addBitCast(const_ptr_ty, alloc); |
| ... | ... | @@ -4039,6 +4049,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com |
| 4039 | 4049 | defer tracy.end(); |
| 4040 | 4050 | |
| 4041 | 4051 | const mod = sema.mod; |
| 4052 | const gpa = sema.gpa; |
| 4042 | 4053 | const inst_data = sema.code.instructions.items(.data)[inst].un_node; |
| 4043 | 4054 | const src = inst_data.src(); |
| 4044 | 4055 | const ty_src: LazySrcLoc = .{ .node_offset_var_decl_ty = inst_data.src_node }; |
| ... | ... | @@ -4104,11 +4115,14 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com |
| 4104 | 4115 | if (!ia1.is_const) { |
| 4105 | 4116 | try sema.validateVarType(block, ty_src, final_elem_ty, false); |
| 4106 | 4117 | } else if (try sema.resolveComptimeKnownAllocValue(block, ptr, final_ptr_ty)) |val| { |
| 4107 | | var anon_decl = try block.startAnonDecl(); |
| 4108 | | defer anon_decl.deinit(); |
| 4109 | | const new_decl_index = try anon_decl.finish(final_elem_ty, val.toValue(), ia1.alignment); |
| 4110 | | const new_mut_ptr = Air.refToInterned(try sema.analyzeDeclRef(new_decl_index)).?.toValue(); |
| 4111 | | const new_const_ptr = (try mod.getCoerced(new_mut_ptr, final_ptr_ty)).toIntern(); |
| 4118 | const const_ptr_ty = (try sema.makePtrTyConst(final_ptr_ty)).toIntern(); |
| 4119 | const new_const_ptr = try mod.intern(.{ .ptr = .{ |
| 4120 | .ty = const_ptr_ty, |
| 4121 | .addr = .{ .anon_decl = .{ |
| 4122 | .val = val, |
| 4123 | .orig_ty = const_ptr_ty, |
| 4124 | } }, |
| 4125 | } }); |
| 4112 | 4126 | |
| 4113 | 4127 | // Remap the ZIR oeprand to the resolved pointer value |
| 4114 | 4128 | sema.inst_map.putAssumeCapacity(Zir.refToIndex(inst_data.operand).?, Air.internedToRef(new_const_ptr)); |
| ... | ... | @@ -4131,7 +4145,6 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com |
| 4131 | 4145 | |
| 4132 | 4146 | // Now we need to go back over all the store instructions, and do the logic as if |
| 4133 | 4147 | // the new result ptr type was available. |
| 4134 | | const gpa = sema.gpa; |
| 4135 | 4148 | |
| 4136 | 4149 | for (ia2.prongs.items) |placeholder_inst| { |
| 4137 | 4150 | var replacement_block = block.makeSubBlock(); |