From f499572ffea4cab93d28e2480bcc9a4234f59089 Mon Sep 17 00:00:00 2001 From: chloe caruso Date: Sun, 2 Jun 2024 21:29:31 -0700 Subject: [PATCH] fix(sema): quit block analysis when hitting `noreturn` --- CHANGELOG.md | 1 + src/core/JsLink.zig | 7 +++++-- src/core/Sema.zig | 18 +++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fc10bd6e5508a5477d5bbfa780c74c98600168e..7f574b564835296081b7cfcade1d085527db0bd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - fix(sema): miscompilation using left side of all binary expression for both sides - fix(sema): handle recursive function calls +- fix(sema): quit block analysis when hitting `noreturn` ## 0.1.3 diff --git a/src/core/JsLink.zig b/src/core/JsLink.zig index 7c9975be09458410f563d5ba057867727df1e40e..8b046e5624dec2fce61a50ce5b71b6282c46ee20 100644 --- a/src/core/JsLink.zig +++ b/src/core/JsLink.zig @@ -147,12 +147,15 @@ fn printDecl(link: *JsLink, decl_index: Decl.Index, writer: anytype) !void { const decl = link.comp.intern_pool.declPtrConst(decl_index); const tree = &decl.codegen.?; - try writer.writeAll("("); + if (tree.param_count != 1) + try writer.writeAll("("); for (0..tree.param_count) |id| { try link.printLocal(@intCast(id), writer); if (id != tree.param_count - 1) try writer.writeAll(", "); } - try writer.writeAll(") => "); + if (tree.param_count != 1) + try writer.writeAll(")"); + try writer.writeAll(" => "); const stmts = tree.mainStatements(); if (stmts.len == 1 and tree.nodeTag(stmts[0]) == .stmt_return) { diff --git a/src/core/Sema.zig b/src/core/Sema.zig index 6c610b1b64933c06c2dc99cf8aa7aa12e0f3f3e8..2a73d9f080a482ed10d4266479c88e97ef39cf3a 100644 --- a/src/core/Sema.zig +++ b/src/core/Sema.zig @@ -33,7 +33,10 @@ pub const Error = error{ // TODO: add handling of this TooManyValues, + // TODO: add handling of this HasNulls, + // TODO: remove this from the primary error set + HitNoReturn, OutOfMemory, } || Comp.File.GetTegError; @@ -210,11 +213,14 @@ pub fn analyzeBlock(s: *Sema, in: Teg.Inst.Index) Error!Air.Inst.Ref { const block = try s.addBlock(); try s.inst_map.add(in, block.block_index.toRef()); - var last: Air.Inst.Ref = undefined; + var last: Air.Inst.Ref = Value.void.toAir(); const instructions = s.code.blockInstructions(in); assert(instructions.len != 0); for (instructions) |inst| { - last = try s.analyzeCode(inst); + last = s.analyzeCode(inst) catch |err| switch (err) { + error.HitNoReturn => break, + else => return err, + }; } if (scratch_top + 1 == s.scratch.items.len) { @@ -585,7 +591,10 @@ fn analyzeRefToBlock(s: *Sema, in: Teg.Inst.Ref) Error!Air.Inst.Ref { const scratch_top = s.scratch.items.len; defer s.scratch.shrinkRetainingCapacity(scratch_top); - const visited = try s.resolveRefRuntime(in); + const visited = s.resolveRefRuntime(in) catch |err| switch (err) { + error.HitNoReturn => Value.void.toAir(), + else => return err, + }; if (scratch_top == s.scratch.items.len and visited.kind == .value) { return visited; @@ -665,6 +674,9 @@ fn coerceRef(s: *Sema, src: InstOp, value: Air.Inst.Ref, to: Type) !Air.Inst.Ref if (from == to) { return value; } + if (from == .noreturn) { + return error.HitNoReturn; + } if (from == .@"opaque") { return value; } -- 2.54.0