Revert "Treat blocks with "return" as "noreturn""

This reverts commit 135b91aecd9be1f6f5806b667e07e383dd481198.

"endsWithBreak()" is not a meaningful question to ask and should not be
used this way. A simple example that defeats this logic is:

```zig
export fn entry() void {
    outer: {
        {
            break :outer;
        }
        return;
    }
}
```
This commit is contained in:
Andrew Kelley 2022-06-06 11:31:54 -07:00
parent 1bdc2b777b
commit 41bf81dc32
3 changed files with 0 additions and 37 deletions

View File

@ -1967,9 +1967,6 @@ fn blockExpr(
}
try blockExprStmts(gz, scope, statements);
if (gz.endsWithNoReturn() and !gz.endsWithBreak()) {
return Zir.Inst.Ref.unreachable_value;
}
return rvalue(gz, rl, .void_value, block_node);
}
@ -9933,13 +9930,6 @@ const GenZir = struct {
return tags[last_inst].isNoReturn();
}
fn endsWithBreak(gz: GenZir) bool {
if (gz.isEmpty()) return false;
const tags = gz.astgen.instructions.items(.tag);
const last_inst = gz.instructions.items[gz.instructions.items.len - 1];
return tags[last_inst].isBreak();
}
/// TODO all uses of this should be replaced with uses of `endsWithNoReturn`.
fn refIsNoReturn(gz: GenZir, inst_ref: Zir.Inst.Ref) bool {
if (inst_ref == .unreachable_value) return true;

View File

@ -1250,19 +1250,6 @@ pub const Inst = struct {
};
}
/// Returns whether the instruction is a "break". This differs from
/// isNoReturn because a "break" in a block statement is not a
/// "noreturn" for the outer scope, whereas the other "noreturn"
/// instructions are.
pub fn isBreak(tag: Tag) bool {
return switch (tag) {
.@"break",
.break_inline,
=> true,
else => false,
};
}
/// AstGen uses this to find out if `Ref.void_value` should be used in place
/// of the result of a given instruction. This allows Sema to forego adding
/// the instruction to the map after analysis.

View File

@ -1,14 +0,0 @@
export fn entry() void {
{
return;
}
return;
}
// error
// target=native
//
// :6:5: error: unreachable code
// :2:5: note: control flow is diverted here