| ... | @@ -129,14 +129,24 @@ fn labeledBlockExpr( | ... | @@ -129,14 +129,24 @@ fn labeledBlockExpr( |
| 129 | const tracy = trace(@src()); | 129 | const tracy = trace(@src()); |
| 130 | defer tracy.end(); | 130 | defer tracy.end(); |
| 131 | | 131 | |
| 132 | const statements = block_node.statements(); | 132 | var block_scope: Scope.GenZIR = .{ |
| | 133 | .parent = parent_scope, |
| | 134 | .decl = parent_scope.decl().?, |
| | 135 | .arena = parent_scope.arena(), |
| | 136 | .instructions = .{}, |
| | 137 | .label = block_node.label, |
| | 138 | }; |
| | 139 | defer block_scope.instructions.deinit(mod.gpa); |
| 133 | | 140 | |
| 134 | if (statements.len == 0) { | 141 | try blockExprStmts(mod, &block_scope.base, &block_node.base, block_node.statements()); |
| 135 | // Hot path for `{}`. | | |
| 136 | return rlWrapVoid(mod, parent_scope, rl, &block_node.base, {}); | | |
| 137 | } | | |
| 138 | | 142 | |
| 139 | return mod.failNode(parent_scope, &block_node.base, "TODO implement labeled blocks", .{}); | 143 | const tree = parent_scope.tree(); |
| | 144 | const src = tree.token_locs[block_node.lbrace].start; |
| | 145 | const block = try addZIRInstBlock(mod, parent_scope, src, .{ |
| | 146 | .instructions = try block_scope.arena.dupe(*zir.Inst, block_scope.instructions.items), |
| | 147 | }); |
| | 148 | |
| | 149 | return &block.base; |
| 140 | } | 150 | } |
| 141 | | 151 | |
| 142 | fn blockExprStmts(mod: *Module, parent_scope: *Scope, node: *ast.Node, statements: []*ast.Node) !void { | 152 | fn blockExprStmts(mod: *Module, parent_scope: *Scope, node: *ast.Node, statements: []*ast.Node) !void { |