| ... | @@ -3095,7 +3095,6 @@ fn zirRefDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -3095,7 +3095,6 @@ fn zirRefDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 3095 | const zcu = pt.zcu; | 3095 | const zcu = pt.zcu; |
| 3096 | const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; | 3096 | const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; |
| 3097 | const src = block.nodeOffset(inst_data.src_node); | 3097 | const src = block.nodeOffset(inst_data.src_node); |
| 3098 | const ptr_src = block.src(.{ .node_offset_deref_ptr = inst_data.src_node }); | | |
| 3099 | const operand = sema.resolveInst(inst_data.operand); | 3098 | const operand = sema.resolveInst(inst_data.operand); |
| 3100 | const operand_ty = sema.typeOf(operand); | 3099 | const operand_ty = sema.typeOf(operand); |
| 3101 | | 3100 | |
| ... | @@ -3104,15 +3103,26 @@ fn zirRefDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -3104,15 +3103,26 @@ fn zirRefDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 3104 | const ptr_info = operand_ty.ptrInfo(zcu); | 3103 | const ptr_info = operand_ty.ptrInfo(zcu); |
| 3105 | return switch (ptr_info.flags.size) { | 3104 | return switch (ptr_info.flags.size) { |
| 3106 | .many, .slice => unreachable, // cannot be dereferenced | 3105 | .many, .slice => unreachable, // cannot be dereferenced |
| 3107 | .c => ptr: { | 3106 | .c => single_ptr: { |
| 3108 | var single_ptr_flags = ptr_info.flags; | 3107 | const single_ptr_ty = try pt.ptrType(p: { |
| 3109 | single_ptr_flags.size = .one; | 3108 | var p = ptr_info; |
| 3110 | single_ptr_flags.is_allowzero = false; | 3109 | p.flags.size = .one; |
| 3111 | const single_ptr_ty = try pt.ptrType(.{ | 3110 | p.flags.is_allowzero = false; |
| 3112 | .child = ptr_info.child, | 3111 | break :p p; |
| 3113 | .flags = single_ptr_flags, | | |
| 3114 | }); | 3112 | }); |
| 3115 | break :ptr try sema.coerceCompatiblePtrs(block, single_ptr_ty, operand, ptr_src); | 3113 | // https://github.com/ziglang/zig/issues/6597 |
| | 3114 | if (sema.resolveValue(operand)) |operand_val| { |
| | 3115 | if (!operand_val.isNull(zcu)) { |
| | 3116 | break :single_ptr try sema.coerceInMemory(operand_val, single_ptr_ty); |
| | 3117 | } |
| | 3118 | } |
| | 3119 | if (block.wantSafety()) { |
| | 3120 | const is_non_null = try block.addUnOp(.is_non_null, operand); |
| | 3121 | try sema.addSafetyCheck(block, src, is_non_null, .unwrap_null); |
| | 3122 | } |
| | 3123 | const single_ptr = try block.addBitCast(single_ptr_ty, operand); |
| | 3124 | try sema.checkKnownAllocPtr(block, operand, single_ptr); |
| | 3125 | break :single_ptr single_ptr; |
| 3116 | }, | 3126 | }, |
| 3117 | .one => operand, | 3127 | .one => operand, |
| 3118 | }; | 3128 | }; |
| ... | @@ -30615,6 +30625,11 @@ fn analyzeLoad( | ... | @@ -30615,6 +30625,11 @@ fn analyzeLoad( |
| 30615 | break :msg msg; | 30625 | break :msg msg; |
| 30616 | }); | 30626 | }); |
| 30617 | | 30627 | |
| | 30628 | // https://github.com/ziglang/zig/issues/6597 |
| | 30629 | if (block.wantSafety() and ptr_ty.isCPtr(zcu)) { |
| | 30630 | const is_non_null = try block.addUnOp(.is_non_null, ptr); |
| | 30631 | try sema.addSafetyCheck(block, src, is_non_null, .unwrap_null); |
| | 30632 | } |
| 30618 | return block.addTyOp(.load, elem_ty, ptr); | 30633 | return block.addTyOp(.load, elem_ty, ptr); |
| 30619 | } | 30634 | } |
| 30620 | | 30635 | |