authorgravatar for john.schmidt.h@gmail.comJohn Schmidt <john.schmidt.h@gmail.com> 2023-02-28 11:27:56+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-01 02:51:59-05:00
loge41bc640c6c4277385236d3dd90b4db566550509
treec3ae2d90492cac331e3546a9ffc5115faf078333
parent98508a12cfae15a895d3e829539f907e9d88d0b6

astgen: do not discard result location in for/while loops

If we use the discard result location any break with a value will be ignored and not checked for usage. Closes https://github.com/ziglang/zig/issues/14684.

3 files changed, 43 insertions(+), 2 deletions(-)

src/AstGen.zig+2-2
......@@ -2342,10 +2342,10 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
23422342
23432343 .while_simple,
23442344 .while_cont,
2345 .@"while", => _ = try whileExpr(gz, scope, .{ .rl = .discard }, inner_node, tree.fullWhile(inner_node).?, true),
2345 .@"while", => _ = try whileExpr(gz, scope, .{ .rl = .none }, inner_node, tree.fullWhile(inner_node).?, true),
23462346
23472347 .for_simple,
2348 .@"for", => _ = try forExpr(gz, scope, .{ .rl = .discard }, inner_node, tree.fullFor(inner_node).?, true),
2348 .@"for", => _ = try forExpr(gz, scope, .{ .rl = .none }, inner_node, tree.fullFor(inner_node).?, true),
23492349
23502350 else => noreturn_src_node = try unusedResultExpr(gz, scope, inner_node),
23512351 // zig fmt: on
test/cases/compile_errors/for_loop_break_value_ignored.zig created+15
......@@ -0,0 +1,15 @@
1fn returns() usize {
2 return 2;
3}
4
5export fn f1() void {
6 for ("hello") |_| {
7 break returns();
8 }
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :6:5: error: incompatible types: 'usize' and 'void'
test/cases/compile_errors/while_loop_break_value_ignored.zig created+26
......@@ -0,0 +1,26 @@
1fn returns() usize {
2 return 2;
3}
4
5export fn f1() void {
6 var a: bool = true;
7 while (a) {
8 break returns();
9 }
10}
11
12export fn f2() void {
13 var x: bool = true;
14 outer: while (x) {
15 while (x) {
16 break :outer returns();
17 }
18 }
19}
20
21// error
22// backend=stage2
23// target=native
24//
25// :7:5: error: incompatible types: 'usize' and 'void'
26// :14:12: error: incompatible types: 'usize' and 'void'