zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
MBRANCH_TODO | 1-
Msrc/AstGen.zig | 9+++++++--
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});