authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-11 04:14:17-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-11 03:01:37-07:00
log2afc689060e1d14e039f3c439d42f22ba09768a3
treed21f693ca782fb5ded76ffba090e0c0e7dbe747c
parent7507a76879bbfb53c170f130ea836b10bc2a42e1

Sema: fix condition for emitting noreturn safety check


1 files changed, 10 insertions(+), 9 deletions(-)

src/Sema.zig+10-9
...@@ -7170,23 +7170,24 @@ fn analyzeCall(...@@ -7170,23 +7170,24 @@ fn analyzeCall(
7170 try sema.ensureResultUsed(block, sema.typeOf(func_inst), call_src);7170 try sema.ensureResultUsed(block, sema.typeOf(func_inst), call_src);
7171 }7171 }
7172 return sema.handleTailCall(block, call_src, func_ty, func_inst);7172 return sema.handleTailCall(block, call_src, func_ty, func_inst);
7173 } else if (block.wantSafety() and func_ty_info.return_type == .noreturn_type) {7173 }
7174 if (block.wantSafety() and func_ty_info.return_type == .noreturn_type) skip_safety: {
7174 // Function pointers and extern functions aren't guaranteed to7175 // Function pointers and extern functions aren't guaranteed to
7175 // actually be noreturn so we add a safety check for them.7176 // actually be noreturn so we add a safety check for them.
7176 check: {7177 if (try sema.resolveMaybeUndefVal(func)) |func_val| {
7177 const func_val = (try sema.resolveMaybeUndefVal(func)) orelse break :check;
7178 switch (mod.intern_pool.indexToKey(func_val.toIntern())) {7178 switch (mod.intern_pool.indexToKey(func_val.toIntern())) {
7179 .func, .extern_func, .ptr => {7179 .func => break :skip_safety,
7180 _ = try block.addNoOp(.unreach);7180 .ptr => |ptr| switch (ptr.addr) {
7181 return Air.Inst.Ref.unreachable_value;7181 .decl => |decl| if (!mod.declPtr(decl).isExtern(mod)) break :skip_safety,
7182 else => {},
7182 },7183 },
7183 else => break :check,7184 else => {},
7184 }7185 }
7185 }7186 }
7186
7187 try sema.safetyPanic(block, .noreturn_returned);7187 try sema.safetyPanic(block, .noreturn_returned);
7188 return Air.Inst.Ref.unreachable_value;7188 return Air.Inst.Ref.unreachable_value;
7189 } else if (func_ty_info.return_type == .noreturn_type) {7189 }
7190 if (func_ty_info.return_type == .noreturn_type) {
7190 _ = try block.addNoOp(.unreach);7191 _ = try block.addNoOp(.unreach);
7191 return Air.Inst.Ref.unreachable_value;7192 return Air.Inst.Ref.unreachable_value;
7192 }7193 }