mirror of
https://github.com/ziglang/zig.git
synced 2025-12-24 07:03:11 +00:00
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:
parent
1bdc2b777b
commit
41bf81dc32
@ -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;
|
||||
|
||||
13
src/Zir.zig
13
src/Zir.zig
@ -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.
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user