| ... | ... | @@ -8060,7 +8060,7 @@ fn analyzeCall( |
| 8060 | 8060 | }; |
| 8061 | 8061 | |
| 8062 | 8062 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Call).@"struct".fields.len + runtime_args.len); |
| 8063 | | const result = try block.addInst(.{ |
| 8063 | const maybe_opv = try block.addInst(.{ |
| 8064 | 8064 | .tag = call_tag, |
| 8065 | 8065 | .data = .{ .pl_op = .{ |
| 8066 | 8066 | .operand = runtime_func, |
| ... | ... | @@ -8072,7 +8072,7 @@ fn analyzeCall( |
| 8072 | 8072 | sema.appendRefsAssumeCapacity(runtime_args); |
| 8073 | 8073 | |
| 8074 | 8074 | if (ensure_result_used) { |
| 8075 | | try sema.ensureResultUsed(block, sema.typeOf(result), call_src); |
| 8075 | try sema.ensureResultUsed(block, sema.typeOf(maybe_opv), call_src); |
| 8076 | 8076 | } |
| 8077 | 8077 | |
| 8078 | 8078 | if (call_tag == .call_always_tail) { |
| ... | ... | @@ -8082,10 +8082,10 @@ fn analyzeCall( |
| 8082 | 8082 | .pointer => func_or_ptr_ty.childType(zcu), |
| 8083 | 8083 | else => unreachable, |
| 8084 | 8084 | }; |
| 8085 | | return sema.handleTailCall(block, call_src, runtime_func_ty, result); |
| 8085 | return sema.handleTailCall(block, call_src, runtime_func_ty, maybe_opv); |
| 8086 | 8086 | } |
| 8087 | 8087 | |
| 8088 | | if (resolved_ret_ty.toIntern() == .noreturn_type) { |
| 8088 | if (ip.isNoReturn(resolved_ret_ty.toIntern())) { |
| 8089 | 8089 | const want_check = c: { |
| 8090 | 8090 | if (!block.wantSafety()) break :c false; |
| 8091 | 8091 | if (func_val != null) break :c false; |
| ... | ... | @@ -8099,6 +8099,11 @@ fn analyzeCall( |
| 8099 | 8099 | return .unreachable_value; |
| 8100 | 8100 | } |
| 8101 | 8101 | |
| 8102 | const result: Air.Inst.Ref = if (try sema.typeHasOnePossibleValue(sema.typeOf(maybe_opv))) |opv| |
| 8103 | .fromValue(opv) |
| 8104 | else |
| 8105 | maybe_opv; |
| 8106 | |
| 8102 | 8107 | return result; |
| 8103 | 8108 | } |
| 8104 | 8109 | |
| ... | ... | @@ -8335,7 +8340,7 @@ fn analyzeCall( |
| 8335 | 8340 | break :result try sema.resolveAnalyzedBlock(block, call_src, &child_block, &inlining.merges, need_debug_scope); |
| 8336 | 8341 | }; |
| 8337 | 8342 | |
| 8338 | | const result: Air.Inst.Ref = if (try sema.resolveValue(result_raw)) |result_val| r: { |
| 8343 | const maybe_opv: Air.Inst.Ref = if (try sema.resolveValue(result_raw)) |result_val| r: { |
| 8339 | 8344 | const val_resolved = try sema.resolveAdHocInferredErrorSet(block, call_src, result_val.toIntern()); |
| 8340 | 8345 | break :r Air.internedToRef(val_resolved); |
| 8341 | 8346 | } else r: { |
| ... | ... | @@ -8347,7 +8352,7 @@ fn analyzeCall( |
| 8347 | 8352 | }; |
| 8348 | 8353 | |
| 8349 | 8354 | if (block.isComptime()) { |
| 8350 | | const result_val = (try sema.resolveValue(result)).?; |
| 8355 | const result_val = (try sema.resolveValue(maybe_opv)).?; |
| 8351 | 8356 | if (want_memoize and sema.allow_memoize and !result_val.canMutateComptimeVarState(zcu)) { |
| 8352 | 8357 | _ = try pt.intern(.{ .memoized_call = .{ |
| 8353 | 8358 | .func = func_val.?.toIntern(), |
| ... | ... | @@ -8359,10 +8364,10 @@ fn analyzeCall( |
| 8359 | 8364 | } |
| 8360 | 8365 | |
| 8361 | 8366 | if (ensure_result_used) { |
| 8362 | | try sema.ensureResultUsed(block, sema.typeOf(result), call_src); |
| 8367 | try sema.ensureResultUsed(block, sema.typeOf(maybe_opv), call_src); |
| 8363 | 8368 | } |
| 8364 | 8369 | |
| 8365 | | return result; |
| 8370 | return maybe_opv; |
| 8366 | 8371 | } |
| 8367 | 8372 | |
| 8368 | 8373 | fn handleTailCall(sema: *Sema, block: *Block, call_src: LazySrcLoc, func_ty: Type, result: Air.Inst.Ref) !Air.Inst.Ref { |