mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
parent
0a7f8c2e01
commit
73f283e3e2
37
src/Sema.zig
37
src/Sema.zig
@ -6387,14 +6387,18 @@ fn zirCall(
|
||||
}
|
||||
resolved_args[arg_index] = resolved;
|
||||
}
|
||||
if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn)
|
||||
if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn) {
|
||||
input_is_error = false; // input was an error type, but no errorable fn's were actually called
|
||||
}
|
||||
|
||||
// AstGen ensures that a call instruction is always preceded by a dbg_stmt instruction.
|
||||
const call_dbg_node = inst - 1;
|
||||
|
||||
if (sema.mod.backendSupportsFeature(.error_return_trace) and sema.mod.comp.bin_file.options.error_return_tracing and
|
||||
!block.is_comptime and !block.is_typeof and (input_is_error or pop_error_return_trace))
|
||||
{
|
||||
const call_inst: Air.Inst.Ref = if (modifier == .always_tail) undefined else b: {
|
||||
break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
|
||||
break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
|
||||
};
|
||||
|
||||
const return_ty = sema.typeOf(call_inst);
|
||||
@ -6423,11 +6427,11 @@ fn zirCall(
|
||||
}
|
||||
|
||||
if (modifier == .always_tail) // Perform the call *after* the restore, so that a tail call is possible.
|
||||
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
|
||||
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
|
||||
|
||||
return call_inst;
|
||||
} else {
|
||||
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
|
||||
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
|
||||
}
|
||||
}
|
||||
|
||||
@ -6511,6 +6515,7 @@ fn analyzeCall(
|
||||
ensure_result_used: bool,
|
||||
uncasted_args: []const Air.Inst.Ref,
|
||||
bound_arg_src: ?LazySrcLoc,
|
||||
call_dbg_node: ?Zir.Inst.Index,
|
||||
) CompileError!Air.Inst.Ref {
|
||||
const mod = sema.mod;
|
||||
|
||||
@ -6628,6 +6633,7 @@ fn analyzeCall(
|
||||
uncasted_args,
|
||||
call_tag,
|
||||
bound_arg_src,
|
||||
call_dbg_node,
|
||||
)) |some| {
|
||||
return some;
|
||||
} else |err| switch (err) {
|
||||
@ -7016,6 +7022,8 @@ fn analyzeCall(
|
||||
}
|
||||
}
|
||||
|
||||
if (call_dbg_node) |some| try sema.zirDbgStmt(block, some);
|
||||
|
||||
try sema.queueFullTypeResolution(func_ty_info.return_type);
|
||||
if (sema.owner_func != null and func_ty_info.return_type.isError()) {
|
||||
sema.owner_func.?.calls_or_awaits_errorable_fn = true;
|
||||
@ -7252,6 +7260,7 @@ fn instantiateGenericCall(
|
||||
uncasted_args: []const Air.Inst.Ref,
|
||||
call_tag: Air.Inst.Tag,
|
||||
bound_arg_src: ?LazySrcLoc,
|
||||
call_dbg_node: ?Zir.Inst.Index,
|
||||
) CompileError!Air.Inst.Ref {
|
||||
const mod = sema.mod;
|
||||
const gpa = sema.gpa;
|
||||
@ -7508,6 +7517,8 @@ fn instantiateGenericCall(
|
||||
try sema.queueFullTypeResolution(new_fn_info.return_type);
|
||||
}
|
||||
|
||||
if (call_dbg_node) |some| try sema.zirDbgStmt(block, some);
|
||||
|
||||
if (sema.owner_func != null and new_fn_info.return_type.isError()) {
|
||||
sema.owner_func.?.calls_or_awaits_errorable_fn = true;
|
||||
}
|
||||
@ -11822,7 +11833,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op
|
||||
const panic_fn = try sema.getBuiltin("panicUnwrapError");
|
||||
const err_return_trace = try sema.getErrorReturnTrace(block);
|
||||
const args: [2]Air.Inst.Ref = .{ err_return_trace, operand };
|
||||
_ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null);
|
||||
_ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null);
|
||||
return true;
|
||||
},
|
||||
.panic => {
|
||||
@ -11833,7 +11844,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op
|
||||
const panic_fn = try sema.getBuiltin("panic");
|
||||
const err_return_trace = try sema.getErrorReturnTrace(block);
|
||||
const args: [3]Air.Inst.Ref = .{ msg_inst, err_return_trace, .null_value };
|
||||
_ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null);
|
||||
_ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null);
|
||||
return true;
|
||||
},
|
||||
else => unreachable,
|
||||
@ -17279,7 +17290,7 @@ fn retWithErrTracing(
|
||||
const args: [1]Air.Inst.Ref = .{err_return_trace};
|
||||
|
||||
if (!need_check) {
|
||||
_ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null);
|
||||
_ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null, null);
|
||||
_ = try block.addUnOp(ret_tag, operand);
|
||||
return always_noreturn;
|
||||
}
|
||||
@ -17290,7 +17301,7 @@ fn retWithErrTracing(
|
||||
|
||||
var else_block = block.makeSubBlock();
|
||||
defer else_block.instructions.deinit(gpa);
|
||||
_ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null);
|
||||
_ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null, null);
|
||||
_ = try else_block.addUnOp(ret_tag, operand);
|
||||
|
||||
try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).Struct.fields.len +
|
||||
@ -21647,7 +21658,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
|
||||
}
|
||||
}
|
||||
const ensure_result_used = extra.flags.ensure_result_used;
|
||||
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
|
||||
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, null);
|
||||
}
|
||||
|
||||
fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
|
||||
@ -23481,7 +23492,7 @@ fn panicWithMsg(
|
||||
Value.null,
|
||||
);
|
||||
const args: [3]Air.Inst.Ref = .{ msg_inst, null_stack_trace, .null_value };
|
||||
_ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null);
|
||||
_ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null);
|
||||
}
|
||||
|
||||
fn panicUnwrapError(
|
||||
@ -23519,7 +23530,7 @@ fn panicUnwrapError(
|
||||
const err = try fail_block.addTyOp(unwrap_err_tag, Type.anyerror, operand);
|
||||
const err_return_trace = try sema.getErrorReturnTrace(&fail_block);
|
||||
const args: [2]Air.Inst.Ref = .{ err_return_trace, err };
|
||||
_ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null);
|
||||
_ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null);
|
||||
}
|
||||
}
|
||||
try sema.addSafetyCheckExtra(parent_block, ok, &fail_block);
|
||||
@ -23604,7 +23615,7 @@ fn panicSentinelMismatch(
|
||||
else {
|
||||
const panic_fn = try sema.getBuiltin("checkNonScalarSentinel");
|
||||
const args: [2]Air.Inst.Ref = .{ expected_sentinel, actual_sentinel };
|
||||
_ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null);
|
||||
_ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null);
|
||||
return;
|
||||
};
|
||||
|
||||
@ -23641,7 +23652,7 @@ fn safetyCheckFormatted(
|
||||
_ = try fail_block.addNoOp(.trap);
|
||||
} else {
|
||||
const panic_fn = try sema.getBuiltin(func);
|
||||
_ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null);
|
||||
_ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null, null);
|
||||
}
|
||||
try sema.addSafetyCheckExtra(parent_block, ok, &fail_block);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user