| ... | @@ -2603,8 +2603,8 @@ fn zirArrayBasePtr( | ... | @@ -2603,8 +2603,8 @@ fn zirArrayBasePtr( |
| 2603 | const start_ptr = sema.resolveInst(inst_data.operand); | 2603 | const start_ptr = sema.resolveInst(inst_data.operand); |
| 2604 | var base_ptr = start_ptr; | 2604 | var base_ptr = start_ptr; |
| 2605 | while (true) switch (sema.typeOf(base_ptr).childType().zigTypeTag()) { | 2605 | while (true) switch (sema.typeOf(base_ptr).childType().zigTypeTag()) { |
| 2606 | .ErrorUnion => base_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, base_ptr, false), | 2606 | .ErrorUnion => base_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, base_ptr, false, true), |
| 2607 | .Optional => base_ptr = try sema.analyzeOptionalPayloadPtr(block, src, base_ptr, false), | 2607 | .Optional => base_ptr = try sema.analyzeOptionalPayloadPtr(block, src, base_ptr, false, true), |
| 2608 | else => break, | 2608 | else => break, |
| 2609 | }; | 2609 | }; |
| 2610 | | 2610 | |
| ... | @@ -2630,8 +2630,8 @@ fn zirFieldBasePtr( | ... | @@ -2630,8 +2630,8 @@ fn zirFieldBasePtr( |
| 2630 | const start_ptr = sema.resolveInst(inst_data.operand); | 2630 | const start_ptr = sema.resolveInst(inst_data.operand); |
| 2631 | var base_ptr = start_ptr; | 2631 | var base_ptr = start_ptr; |
| 2632 | while (true) switch (sema.typeOf(base_ptr).childType().zigTypeTag()) { | 2632 | while (true) switch (sema.typeOf(base_ptr).childType().zigTypeTag()) { |
| 2633 | .ErrorUnion => base_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, base_ptr, false), | 2633 | .ErrorUnion => base_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, base_ptr, false, true), |
| 2634 | .Optional => base_ptr = try sema.analyzeOptionalPayloadPtr(block, src, base_ptr, false), | 2634 | .Optional => base_ptr = try sema.analyzeOptionalPayloadPtr(block, src, base_ptr, false, true), |
| 2635 | else => break, | 2635 | else => break, |
| 2636 | }; | 2636 | }; |
| 2637 | | 2637 | |
| ... | @@ -5263,7 +5263,7 @@ fn zirOptionalPayloadPtr( | ... | @@ -5263,7 +5263,7 @@ fn zirOptionalPayloadPtr( |
| 5263 | const optional_ptr = sema.resolveInst(inst_data.operand); | 5263 | const optional_ptr = sema.resolveInst(inst_data.operand); |
| 5264 | const src = inst_data.src(); | 5264 | const src = inst_data.src(); |
| 5265 | | 5265 | |
| 5266 | return sema.analyzeOptionalPayloadPtr(block, src, optional_ptr, safety_check); | 5266 | return sema.analyzeOptionalPayloadPtr(block, src, optional_ptr, safety_check, false); |
| 5267 | } | 5267 | } |
| 5268 | | 5268 | |
| 5269 | fn analyzeOptionalPayloadPtr( | 5269 | fn analyzeOptionalPayloadPtr( |
| ... | @@ -5272,6 +5272,7 @@ fn analyzeOptionalPayloadPtr( | ... | @@ -5272,6 +5272,7 @@ fn analyzeOptionalPayloadPtr( |
| 5272 | src: LazySrcLoc, | 5272 | src: LazySrcLoc, |
| 5273 | optional_ptr: Air.Inst.Ref, | 5273 | optional_ptr: Air.Inst.Ref, |
| 5274 | safety_check: bool, | 5274 | safety_check: bool, |
| | 5275 | initializing: bool, |
| 5275 | ) CompileError!Air.Inst.Ref { | 5276 | ) CompileError!Air.Inst.Ref { |
| 5276 | const optional_ptr_ty = sema.typeOf(optional_ptr); | 5277 | const optional_ptr_ty = sema.typeOf(optional_ptr); |
| 5277 | assert(optional_ptr_ty.zigTypeTag() == .Pointer); | 5278 | assert(optional_ptr_ty.zigTypeTag() == .Pointer); |
| ... | @@ -5290,7 +5291,7 @@ fn analyzeOptionalPayloadPtr( | ... | @@ -5290,7 +5291,7 @@ fn analyzeOptionalPayloadPtr( |
| 5290 | | 5291 | |
| 5291 | if (try sema.resolveDefinedValue(block, src, optional_ptr)) |pointer_val| { | 5292 | if (try sema.resolveDefinedValue(block, src, optional_ptr)) |pointer_val| { |
| 5292 | if (try sema.pointerDeref(block, src, pointer_val, optional_ptr_ty)) |val| { | 5293 | if (try sema.pointerDeref(block, src, pointer_val, optional_ptr_ty)) |val| { |
| 5293 | if (safety_check) { | 5294 | if (!initializing) { |
| 5294 | if (val.isNull()) { | 5295 | if (val.isNull()) { |
| 5295 | return sema.fail(block, src, "unable to unwrap null", .{}); | 5296 | return sema.fail(block, src, "unable to unwrap null", .{}); |
| 5296 | } | 5297 | } |
| ... | @@ -5308,7 +5309,10 @@ fn analyzeOptionalPayloadPtr( | ... | @@ -5308,7 +5309,10 @@ fn analyzeOptionalPayloadPtr( |
| 5308 | const is_non_null = try block.addUnOp(.is_non_null_ptr, optional_ptr); | 5309 | const is_non_null = try block.addUnOp(.is_non_null_ptr, optional_ptr); |
| 5309 | try sema.addSafetyCheck(block, is_non_null, .unwrap_null); | 5310 | try sema.addSafetyCheck(block, is_non_null, .unwrap_null); |
| 5310 | } | 5311 | } |
| 5311 | return block.addTyOp(.optional_payload_ptr, child_pointer, optional_ptr); | 5312 | return block.addTyOp(if (initializing) |
| | 5313 | .optional_payload_ptr_set |
| | 5314 | else |
| | 5315 | .optional_payload_ptr, child_pointer, optional_ptr); |
| 5312 | } | 5316 | } |
| 5313 | | 5317 | |
| 5314 | /// Value in, value out. | 5318 | /// Value in, value out. |
| ... | @@ -5412,7 +5416,7 @@ fn zirErrUnionPayloadPtr( | ... | @@ -5412,7 +5416,7 @@ fn zirErrUnionPayloadPtr( |
| 5412 | const operand = sema.resolveInst(inst_data.operand); | 5416 | const operand = sema.resolveInst(inst_data.operand); |
| 5413 | const src = inst_data.src(); | 5417 | const src = inst_data.src(); |
| 5414 | | 5418 | |
| 5415 | return sema.analyzeErrUnionPayloadPtr(block, src, operand, safety_check); | 5419 | return sema.analyzeErrUnionPayloadPtr(block, src, operand, safety_check, false); |
| 5416 | } | 5420 | } |
| 5417 | | 5421 | |
| 5418 | fn analyzeErrUnionPayloadPtr( | 5422 | fn analyzeErrUnionPayloadPtr( |
| ... | @@ -5421,6 +5425,7 @@ fn analyzeErrUnionPayloadPtr( | ... | @@ -5421,6 +5425,7 @@ fn analyzeErrUnionPayloadPtr( |
| 5421 | src: LazySrcLoc, | 5425 | src: LazySrcLoc, |
| 5422 | operand: Air.Inst.Ref, | 5426 | operand: Air.Inst.Ref, |
| 5423 | safety_check: bool, | 5427 | safety_check: bool, |
| | 5428 | initializing: bool, |
| 5424 | ) CompileError!Air.Inst.Ref { | 5429 | ) CompileError!Air.Inst.Ref { |
| 5425 | const operand_ty = sema.typeOf(operand); | 5430 | const operand_ty = sema.typeOf(operand); |
| 5426 | assert(operand_ty.zigTypeTag() == .Pointer); | 5431 | assert(operand_ty.zigTypeTag() == .Pointer); |
| ... | @@ -5437,7 +5442,7 @@ fn analyzeErrUnionPayloadPtr( | ... | @@ -5437,7 +5442,7 @@ fn analyzeErrUnionPayloadPtr( |
| 5437 | | 5442 | |
| 5438 | if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { | 5443 | if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { |
| 5439 | if (try sema.pointerDeref(block, src, pointer_val, operand_ty)) |val| { | 5444 | if (try sema.pointerDeref(block, src, pointer_val, operand_ty)) |val| { |
| 5440 | if (safety_check) { | 5445 | if (!initializing) { |
| 5441 | if (val.getError()) |name| { | 5446 | if (val.getError()) |name| { |
| 5442 | return sema.fail(block, src, "caught unexpected error '{s}'", .{name}); | 5447 | return sema.fail(block, src, "caught unexpected error '{s}'", .{name}); |
| 5443 | } | 5448 | } |
| ... | @@ -5455,7 +5460,10 @@ fn analyzeErrUnionPayloadPtr( | ... | @@ -5455,7 +5460,10 @@ fn analyzeErrUnionPayloadPtr( |
| 5455 | const is_non_err = try block.addUnOp(.is_err, operand); | 5460 | const is_non_err = try block.addUnOp(.is_err, operand); |
| 5456 | try sema.addSafetyCheck(block, is_non_err, .unwrap_errunion); | 5461 | try sema.addSafetyCheck(block, is_non_err, .unwrap_errunion); |
| 5457 | } | 5462 | } |
| 5458 | return block.addTyOp(.unwrap_errunion_payload_ptr, operand_pointer_ty, operand); | 5463 | return block.addTyOp(if (initializing) |
| | 5464 | .errunion_payload_ptr_set |
| | 5465 | else |
| | 5466 | .unwrap_errunion_payload_ptr, operand_pointer_ty, operand); |
| 5459 | } | 5467 | } |
| 5460 | | 5468 | |
| 5461 | /// Value in, value out | 5469 | /// Value in, value out |