authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-20 16:38:58-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-20 17:04:11-07:00
log458c4b6fc69df38fe119b3213efb56cb0e454193
tree6bd5065329f0ec63cc4a6f1a496193db55706875
parenta59bcae59f1b45ef6585793e6b90e490593c4d31

AstGen: implement defer for `continue`


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

BRANCH_TODO-1
......@@ -1,6 +1,5 @@
11 * defer
22 - `break`
3 - `continue`
43 * nested function decl: how to refer to params?
54 * look for cached zir code
65 * save zir code to cache
src/AstGen.zig+7-2
......@@ -1294,8 +1294,13 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: ast.Node.Index)
12941294 },
12951295 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
12961296 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
1297 .defer_normal => @panic("TODO continue/defer"),
1298 .defer_error => @panic("TODO continue/defer"),
1297 .defer_normal => {
1298 const defer_scope = scope.cast(Scope.Defer).?;
1299 scope = defer_scope.parent;
1300 const expr_node = node_datas[defer_scope.defer_node].rhs;
1301 try unusedResultExpr(parent_gz, defer_scope.parent, expr_node);
1302 },
1303 .defer_error => scope = scope.cast(Scope.LocalPtr).?.parent,
12991304 else => if (break_label != 0) {
13001305 const label_name = try astgen.identifierTokenString(break_label);
13011306 return astgen.failTok(break_label, "label not found: '{s}'", .{label_name});