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 @@...@@ -1,6 +1,5 @@
1 * defer1 * defer
2 - `break`2 - `break`
3 - `continue`
4 * nested function decl: how to refer to params?3 * nested function decl: how to refer to params?
5 * look for cached zir code4 * look for cached zir code
6 * save zir code to cache5 * 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)...@@ -1294,8 +1294,13 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: ast.Node.Index)
1294 },1294 },
1295 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,1295 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
1296 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,1296 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
1297 .defer_normal => @panic("TODO continue/defer"),1297 .defer_normal => {
1298 .defer_error => @panic("TODO continue/defer"),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,
1299 else => if (break_label != 0) {1304 else => if (break_label != 0) {
1300 const label_name = try astgen.identifierTokenString(break_label);1305 const label_name = try astgen.identifierTokenString(break_label);
1301 return astgen.failTok(break_label, "label not found: '{s}'", .{label_name});1306 return astgen.failTok(break_label, "label not found: '{s}'", .{label_name});