diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-12-27 15:26:56 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-12-27 15:30:31 -0700 |
| commit | 70894d5c2f6032b0d0be1fa00a30554b7e6db2d6 (patch) | |
| tree | f54e4c5757e41dd1add4aa61ff60a6e6923087d6 /test/compile_errors.zig | |
| parent | 2c23699594348d5707d6cc9cd591cc8c28fa4605 (diff) | |
| download | zig-70894d5c2f6032b0d0be1fa00a30554b7e6db2d6.tar.gz zig-70894d5c2f6032b0d0be1fa00a30554b7e6db2d6.zip | |
AstGen: fix loop result locations
The main problem was that the loop body was treated as an expression
that was one of the peer result values of a loop, when in reality the
loop body is noreturn and only the `break` operands are the result
values of loops.
This was solved by introducing an override that prevents rvalue() from
emitting a store to result location instruction for loop bodies.
An orthogonal change also included in this commit is switching
`elem_val` index expressions to using `coerced_ty` and doing the
coercion to `usize` inside `Sema`, resulting in smaller ZIR (since the
cast becomes implied).
I also changed the break operand expression to use `reachableExpr`,
introducing a new compile error for double break.
This makes a few more behavior tests pass for `while` and `for` loops.
Diffstat (limited to 'test/compile_errors.zig')
| -rw-r--r-- | test/compile_errors.zig | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/test/compile_errors.zig b/test/compile_errors.zig index b1eaa03028..2a79fd2f14 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -5042,6 +5042,17 @@ pub fn addCases(ctx: *TestContext) !void { "tmp.zig:2:12: note: control flow is diverted here", }); + ctx.objErrStage1("unreachable code - double break", + \\export fn a() void { + \\ const b = blk: { + \\ break :blk break :blk @as(u32, 1); + \\ }; + \\} + , &[_][]const u8{ + "tmp.zig:3:9: error: unreachable code", + "tmp.zig:3:20: note: control flow is diverted here", + }); + ctx.objErrStage1("chained comparison operators", \\export fn a(value: u32) bool { \\ return 1 < value < 1000; |
