@@ -7198,14 +7198,6 @@ fn zirCall(
71987198 const call_dbg_node: Zir.Inst.Index = @enumFromInt(@intFromEnum(inst) - 1);
71997199 const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call);
72007200
7201- switch (sema.owner.unwrap()) {
7202- .@"comptime", .type, .memoized_state, .nav_ty, .nav_val => input_is_error = false,
7203- .func => |owner_func| if (!zcu.intern_pool.funcAnalysisUnordered(owner_func).calls_or_awaits_errorable_fn) {
7204- // No errorable fn actually called; we have no error return trace
7205- input_is_error = false;
7206- },
7207- }
7208-
72097201 if (block.ownerModule().error_tracing and
72107202 !block.isComptime() and !block.is_typeof and (input_is_error or pop_error_return_trace))
72117203 {
@@ -7872,6 +7864,12 @@ fn analyzeCall(
78727864 }
78737865 break :msg msg;
78747866 });
7867+ if (func_ty_info.cc == .auto) {
7868+ switch (sema.owner.unwrap()) {
7869+ .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {},
7870+ .func => |owner_func| ip.funcSetHasErrorTrace(owner_func, true),
7871+ }
7872+ }
78757873 for (args, 0..) |arg, arg_idx| {
78767874 try sema.validateRuntimeValue(block, args_info.argSrc(block, arg_idx), arg);
78777875 }
@@ -7946,13 +7944,6 @@ fn analyzeCall(
79467944 try zcu.ensureFuncBodyAnalysisQueued(runtime_func_val.toIntern());
79477945 }
79487946
7949- switch (sema.owner.unwrap()) {
7950- .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {},
7951- .func => |owner_func| if (resolved_ret_ty.isError(zcu)) {
7952- ip.funcSetCallsOrAwaitsErrorableFn(owner_func);
7953- },
7954- }
7955-
79567947 const call_tag: Air.Inst.Tag = switch (modifier) {
79577948 .auto, .no_async => .call,
79587949 .never_tail => .call_never_tail,
@@ -19706,16 +19697,16 @@ fn retWithErrTracing(
1970619697 .bool_false => false,
1970719698 else => true,
1970819699 };
19700+
19701+ // This means we're returning something that might be an error!
19702+ // This should only be possible with the `auto` cc, so we definitely have an error trace.
19703+ assert(pt.zcu.intern_pool.funcAnalysisUnordered(sema.owner.unwrap().func).has_error_trace);
19704+
1970919705 const gpa = sema.gpa;
19710- const stack_trace_ty = try sema.getBuiltinType(src, .StackTrace);
19711- try stack_trace_ty.resolveFields(pt);
19712- const ptr_stack_trace_ty = try pt.singleMutPtrType(stack_trace_ty);
19713- const err_return_trace = try block.addTy(.err_return_trace, ptr_stack_trace_ty);
1971419706 const return_err_fn = Air.internedToRef(try sema.getBuiltin(src, .returnError));
19715- const args: [1]Air.Inst.Ref = .{err_return_trace};
1971619707
1971719708 if (!need_check) {
19718- try sema.callBuiltin(block, src, return_err_fn, .never_inline, &args , .@"error return");
19709+ try sema.callBuiltin(block, src, return_err_fn, .never_inline, &.{} , .@"error return");
1971919710 _ = try block.addUnOp(ret_tag, operand);
1972019711 return;
1972119712 }
@@ -19726,7 +19717,7 @@ fn retWithErrTracing(
1972619717
1972719718 var else_block = block.makeSubBlock();
1972819719 defer else_block.instructions.deinit(gpa);
19729- try sema.callBuiltin(&else_block, src, return_err_fn, .never_inline, &args , .@"error return");
19720+ try sema.callBuiltin(&else_block, src, return_err_fn, .never_inline, &.{} , .@"error return");
1973019721 _ = try else_block.addUnOp(ret_tag, operand);
1973119722
1973219723 try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).@"struct".fields.len +
@@ -19837,7 +19828,7 @@ fn restoreErrRetIndex(sema: *Sema, start_block: *Block, src: LazySrcLoc, target_
1983719828 return;
1983819829 }
1983919830
19840- if (!zcu.intern_pool.funcAnalysisUnordered(sema.owner.unwrap().func).calls_or_awaits_errorable_fn ) return;
19831+ if (!zcu.intern_pool.funcAnalysisUnordered(sema.owner.unwrap().func).has_error_trace ) return;
1984119832 if (!start_block.ownerModule().error_tracing) return;
1984219833
1984319834 assert(saved_index != .none); // The .error_return_trace_index field was dropped somewhere
@@ -21123,7 +21114,7 @@ fn getErrorReturnTrace(sema: *Sema, block: *Block) CompileError!Air.Inst.Ref {
2112321114 const opt_ptr_stack_trace_ty = try pt.optionalType(ptr_stack_trace_ty.toIntern());
2112421115
2112521116 switch (sema.owner.unwrap()) {
21126- .func => |func| if (ip.funcAnalysisUnordered(func).calls_or_awaits_errorable_fn and block.ownerModule().error_tracing) {
21117+ .func => |func| if (ip.funcAnalysisUnordered(func).has_error_trace and block.ownerModule().error_tracing) {
2112721118 return block.addTy(.err_return_trace, opt_ptr_stack_trace_ty);
2112821119 },
2112921120 .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {},
@@ -27096,6 +27087,10 @@ fn preparePanicId(sema: *Sema, src: LazySrcLoc, panic_id: Zcu.PanicId) !InternPo
2709627087 const zcu = sema.pt.zcu;
2709727088 try sema.ensureMemoizedStateResolved(src, .panic);
2709827089 try zcu.ensureFuncBodyAnalysisQueued(zcu.builtin_decl_values.get(.@"Panic.call"));
27090+ switch (sema.owner.unwrap()) {
27091+ .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {},
27092+ .func => |owner_func| zcu.intern_pool.funcSetHasErrorTrace(owner_func, true),
27093+ }
2709927094 return zcu.builtin_decl_values.get(panic_id.toBuiltin());
2710027095}
2710127096
0 commit comments