authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-02 14:05:27+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-02 17:57:10+03:00
logdb54cd247ddb8bf7b4225eaaf1e7a851151f8f0b
tree0fa0f95f5b33a02faa8b46362d0bbd28d6d11d39
parent8b58dab78b8a157a39377654691324dd71f77d23

Sema: do not emit dbg_inline_end after NoReturn

Closes #12698

4 files changed, 26 insertions(+), 2 deletions(-)

src/Sema.zig+6-2
...@@ -5569,7 +5569,11 @@ fn zirCall(...@@ -5569,7 +5569,11 @@ fn zirCall(
5569 const param_ty_inst = try sema.addType(param_ty);5569 const param_ty_inst = try sema.addType(param_ty);
5570 try sema.inst_map.put(sema.gpa, inst, param_ty_inst);5570 try sema.inst_map.put(sema.gpa, inst, param_ty_inst);
55715571
5572 resolved_args[arg_index] = try sema.resolveBody(block, args_body[arg_start..arg_end], inst);5572 const resolved = try sema.resolveBody(block, args_body[arg_start..arg_end], inst);
5573 if (sema.typeOf(resolved).zigTypeTag() == .NoReturn) {
5574 return resolved;
5575 }
5576 resolved_args[arg_index] = resolved;
5573 }5577 }
55745578
5575 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);5579 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
...@@ -6047,7 +6051,7 @@ fn analyzeCall(...@@ -6047,7 +6051,7 @@ fn analyzeCall(
6047 break :result try sema.analyzeBlockBody(block, call_src, &child_block, merges);6051 break :result try sema.analyzeBlockBody(block, call_src, &child_block, merges);
6048 };6052 };
60496053
6050 if (!is_comptime_call) {6054 if (!is_comptime_call and sema.typeOf(result).zigTypeTag() != .NoReturn) {
6051 try sema.emitDbgInline(6055 try sema.emitDbgInline(
6052 block,6056 block,
6053 module_fn,6057 module_fn,
test/standalone.zig+2
...@@ -13,6 +13,8 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -13,6 +13,8 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
13 cases.add("test/standalone/guess_number/main.zig");13 cases.add("test/standalone/guess_number/main.zig");
14 cases.add("test/standalone/main_return_error/error_u8.zig");14 cases.add("test/standalone/main_return_error/error_u8.zig");
15 cases.add("test/standalone/main_return_error/error_u8_non_zero.zig");15 cases.add("test/standalone/main_return_error/error_u8_non_zero.zig");
16 cases.add("test/standalone/noreturn_call/inline.zig");
17 cases.add("test/standalone/noreturn_call/as_arg.zig");
16 cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{});18 cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{});
17 cases.addBuildFile("test/standalone/shared_library/build.zig", .{});19 cases.addBuildFile("test/standalone/shared_library/build.zig", .{});
18 cases.addBuildFile("test/standalone/mix_o_files/build.zig", .{});20 cases.addBuildFile("test/standalone/mix_o_files/build.zig", .{});
test/standalone/noreturn_call/as_arg.zig created+8
...@@ -0,0 +1,8 @@
1const std = @import("std");
2fn foo() noreturn {
3 std.process.exit(0);
4}
5fn bar(_: u8, _: u8) void {}
6pub fn main() void {
7 bar(foo(), @compileError("bad"));
8}
test/standalone/noreturn_call/inline.zig created+10
...@@ -0,0 +1,10 @@
1pub fn main() void {
2 _ = bar();
3}
4inline fn bar() u8 {
5 noret();
6}
7const std = @import("std");
8inline fn noret() noreturn {
9 std.process.exit(0);
10}