commit 458c4b6fc69df38fe119b3213efb56cb0e454193 (tree)
parent a59bcae59f1b45ef6585793e6b90e490593c4d31
Author: Andrew Kelley <andrew@ziglang.org>
Date: Tue, 20 Apr 2021 16:38:58 -0700
AstGen: implement defer for `continue`
Diffstat:
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/BRANCH_TODO b/BRANCH_TODO
@@ -1,6 +1,5 @@
* defer
- `break`
- - `continue`
* nested function decl: how to refer to params?
* look for cached zir code
* save zir code to cache
diff --git a/src/AstGen.zig b/src/AstGen.zig
@@ -1294,8 +1294,13 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: ast.Node.Index)
},
.local_val => scope = scope.cast(Scope.LocalVal).?.parent,
.local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
- .defer_normal => @panic("TODO continue/defer"),
- .defer_error => @panic("TODO continue/defer"),
+ .defer_normal => {
+ const defer_scope = scope.cast(Scope.Defer).?;
+ scope = defer_scope.parent;
+ const expr_node = node_datas[defer_scope.defer_node].rhs;
+ try unusedResultExpr(parent_gz, defer_scope.parent, expr_node);
+ },
+ .defer_error => scope = scope.cast(Scope.LocalPtr).?.parent,
else => if (break_label != 0) {
const label_name = try astgen.identifierTokenString(break_label);
return astgen.failTok(break_label, "label not found: '{s}'", .{label_name});