| ... | ... | @@ -2603,8 +2603,8 @@ fn zirArrayBasePtr( |
| 2603 | 2603 | const start_ptr = sema.resolveInst(inst_data.operand); |
| 2604 | 2604 | var base_ptr = start_ptr; |
| 2605 | 2605 | while (true) switch (sema.typeOf(base_ptr).childType().zigTypeTag()) { |
| 2606 | | .ErrorUnion => base_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, base_ptr, false), |
| 2607 | | .Optional => base_ptr = try sema.analyzeOptionalPayloadPtr(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, true), |
| 2608 | 2608 | else => break, |
| 2609 | 2609 | }; |
| 2610 | 2610 | |
| ... | ... | @@ -2630,8 +2630,8 @@ fn zirFieldBasePtr( |
| 2630 | 2630 | const start_ptr = sema.resolveInst(inst_data.operand); |
| 2631 | 2631 | var base_ptr = start_ptr; |
| 2632 | 2632 | while (true) switch (sema.typeOf(base_ptr).childType().zigTypeTag()) { |
| 2633 | | .ErrorUnion => base_ptr = try sema.analyzeErrUnionPayloadPtr(block, src, base_ptr, false), |
| 2634 | | .Optional => base_ptr = try sema.analyzeOptionalPayloadPtr(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, true), |
| 2635 | 2635 | else => break, |
| 2636 | 2636 | }; |
| 2637 | 2637 | |
| ... | ... | @@ -5263,7 +5263,7 @@ fn zirOptionalPayloadPtr( |
| 5263 | 5263 | const optional_ptr = sema.resolveInst(inst_data.operand); |
| 5264 | 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 | 5269 | fn analyzeOptionalPayloadPtr( |
| ... | ... | @@ -5272,6 +5272,7 @@ fn analyzeOptionalPayloadPtr( |
| 5272 | 5272 | src: LazySrcLoc, |
| 5273 | 5273 | optional_ptr: Air.Inst.Ref, |
| 5274 | 5274 | safety_check: bool, |
| 5275 | initializing: bool, |
| 5275 | 5276 | ) CompileError!Air.Inst.Ref { |
| 5276 | 5277 | const optional_ptr_ty = sema.typeOf(optional_ptr); |
| 5277 | 5278 | assert(optional_ptr_ty.zigTypeTag() == .Pointer); |
| ... | ... | @@ -5290,7 +5291,7 @@ fn analyzeOptionalPayloadPtr( |
| 5290 | 5291 | |
| 5291 | 5292 | if (try sema.resolveDefinedValue(block, src, optional_ptr)) |pointer_val| { |
| 5292 | 5293 | if (try sema.pointerDeref(block, src, pointer_val, optional_ptr_ty)) |val| { |
| 5293 | | if (safety_check) { |
| 5294 | if (!initializing) { |
| 5294 | 5295 | if (val.isNull()) { |
| 5295 | 5296 | return sema.fail(block, src, "unable to unwrap null", .{}); |
| 5296 | 5297 | } |
| ... | ... | @@ -5308,7 +5309,10 @@ fn analyzeOptionalPayloadPtr( |
| 5308 | 5309 | const is_non_null = try block.addUnOp(.is_non_null_ptr, optional_ptr); |
| 5309 | 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 | 5318 | /// Value in, value out. |
| ... | ... | @@ -5412,7 +5416,7 @@ fn zirErrUnionPayloadPtr( |
| 5412 | 5416 | const operand = sema.resolveInst(inst_data.operand); |
| 5413 | 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 | 5422 | fn analyzeErrUnionPayloadPtr( |
| ... | ... | @@ -5421,6 +5425,7 @@ fn analyzeErrUnionPayloadPtr( |
| 5421 | 5425 | src: LazySrcLoc, |
| 5422 | 5426 | operand: Air.Inst.Ref, |
| 5423 | 5427 | safety_check: bool, |
| 5428 | initializing: bool, |
| 5424 | 5429 | ) CompileError!Air.Inst.Ref { |
| 5425 | 5430 | const operand_ty = sema.typeOf(operand); |
| 5426 | 5431 | assert(operand_ty.zigTypeTag() == .Pointer); |
| ... | ... | @@ -5437,7 +5442,7 @@ fn analyzeErrUnionPayloadPtr( |
| 5437 | 5442 | |
| 5438 | 5443 | if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { |
| 5439 | 5444 | if (try sema.pointerDeref(block, src, pointer_val, operand_ty)) |val| { |
| 5440 | | if (safety_check) { |
| 5445 | if (!initializing) { |
| 5441 | 5446 | if (val.getError()) |name| { |
| 5442 | 5447 | return sema.fail(block, src, "caught unexpected error '{s}'", .{name}); |
| 5443 | 5448 | } |
| ... | ... | @@ -5455,7 +5460,10 @@ fn analyzeErrUnionPayloadPtr( |
| 5455 | 5460 | const is_non_err = try block.addUnOp(.is_err, operand); |
| 5456 | 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 | 5469 | /// Value in, value out |