| ... | ... | @@ -411,13 +411,16 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In |
| 411 | 411 | return callExpr(mod, scope, rl, node, tree.callFull(node)); |
| 412 | 412 | }, |
| 413 | 413 | |
| 414 | | .unreachable_literal => return gz.add(.{ |
| 415 | | .tag = .@"unreachable", |
| 416 | | .data = .{ .@"unreachable" = .{ |
| 417 | | .safety = true, |
| 418 | | .src_node = gz.zir_code.decl.nodeIndexToRelative(node), |
| 419 | | } }, |
| 420 | | }), |
| 414 | .unreachable_literal => { |
| 415 | _ = try gz.addAsIndex(.{ |
| 416 | .tag = .@"unreachable", |
| 417 | .data = .{ .@"unreachable" = .{ |
| 418 | .safety = true, |
| 419 | .src_node = gz.zir_code.decl.nodeIndexToRelative(node), |
| 420 | } }, |
| 421 | }); |
| 422 | return zir.Inst.Ref.unreachable_value; |
| 423 | }, |
| 421 | 424 | .@"return" => return ret(mod, scope, node), |
| 422 | 425 | .field_access => return fieldAccess(mod, scope, rl, node), |
| 423 | 426 | .float_literal => return floatLiteral(mod, scope, rl, node), |
| ... | ... | @@ -602,8 +605,8 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In |
| 602 | 605 | .tagged_union_enum_tag_trailing, |
| 603 | 606 | => return containerDecl(mod, scope, rl, tree.taggedUnionEnumTag(node)), |
| 604 | 607 | |
| 605 | | .@"break" => return breakExpr(mod, scope, rl, node), |
| 606 | | .@"continue" => return continueExpr(mod, scope, rl, node), |
| 608 | .@"break" => return breakExpr(mod, scope, node), |
| 609 | .@"continue" => return continueExpr(mod, scope, node), |
| 607 | 610 | .grouped_expression => return expr(mod, scope, rl, node_datas[node].lhs), |
| 608 | 611 | .array_type => return arrayType(mod, scope, rl, node), |
| 609 | 612 | .array_type_sentinel => return arrayTypeSentinel(mod, scope, rl, node), |
| ... | ... | @@ -666,28 +669,19 @@ pub fn comptimeExpr( |
| 666 | 669 | return result; |
| 667 | 670 | } |
| 668 | 671 | |
| 669 | | fn breakExpr( |
| 670 | | mod: *Module, |
| 671 | | parent_scope: *Scope, |
| 672 | | rl: ResultLoc, |
| 673 | | node: ast.Node.Index, |
| 674 | | ) InnerError!zir.Inst.Ref { |
| 675 | | const tree = parent_scope.tree(); |
| 672 | fn breakExpr(mod: *Module, parent_scope: *Scope, node: ast.Node.Index) InnerError!zir.Inst.Ref { |
| 673 | const parent_gz = parent_scope.getGenZir(); |
| 674 | const tree = parent_gz.tree(); |
| 676 | 675 | const node_datas = tree.nodes.items(.data); |
| 677 | | const main_tokens = tree.nodes.items(.main_token); |
| 678 | | |
| 679 | | const break_token = main_tokens[node]; |
| 680 | 676 | const break_label = node_datas[node].lhs; |
| 681 | 677 | const rhs = node_datas[node].rhs; |
| 682 | 678 | |
| 683 | | const parent_gz = parent_scope.getGenZir(); |
| 684 | | |
| 685 | 679 | // Look for the label in the scope. |
| 686 | 680 | var scope = parent_scope; |
| 687 | 681 | while (true) { |
| 688 | 682 | switch (scope.tag) { |
| 689 | 683 | .gen_zir => { |
| 690 | | const block_gz = scope.getGenZir(); |
| 684 | const block_gz = scope.cast(Scope.GenZir).?; |
| 691 | 685 | |
| 692 | 686 | const block_inst = blk: { |
| 693 | 687 | if (break_label != 0) { |
| ... | ... | @@ -705,8 +699,8 @@ fn breakExpr( |
| 705 | 699 | }; |
| 706 | 700 | |
| 707 | 701 | if (rhs == 0) { |
| 708 | | const result = try parent_gz.addBreakVoid(block_gz, block_inst, node); |
| 709 | | return rvalue(mod, parent_scope, rl, result, node); |
| 702 | _ = try parent_gz.addBreakVoid(block_inst, node); |
| 703 | return zir.Inst.Ref.unreachable_value; |
| 710 | 704 | } |
| 711 | 705 | block_gz.break_count += 1; |
| 712 | 706 | const prev_rvalue_rl_count = block_gz.rvalue_rl_count; |
| ... | ... | @@ -721,13 +715,13 @@ fn breakExpr( |
| 721 | 715 | if (have_store_to_block) { |
| 722 | 716 | const zir_tags = parent_gz.zir_code.instructions.items(.tag); |
| 723 | 717 | const zir_datas = parent_gz.zir_code.instructions.items(.data); |
| 724 | | const last_inst = zir_tags.len - 2; |
| 725 | | assert(zir_tags[last_inst] == .store_to_block_ptr); |
| 726 | | assert(zir_datas[last_inst].bin.lhs == block_gz.rl_ptr); |
| 727 | | try block_gz.labeled_store_to_block_ptr_list.append(mod.gpa, @intCast(zir.Inst.Ref, last_inst)); |
| 718 | const store_inst = @intCast(u32, zir_tags.len - 2); |
| 719 | assert(zir_tags[store_inst] == .store_to_block_ptr); |
| 720 | assert(zir_datas[store_inst].bin.lhs == block_gz.rl_ptr); |
| 721 | try block_gz.labeled_store_to_block_ptr_list.append(mod.gpa, store_inst); |
| 728 | 722 | } |
| 729 | 723 | } |
| 730 | | return rvalue(mod, parent_scope, rl, br, node); |
| 724 | return zir.Inst.Ref.unreachable_value; |
| 731 | 725 | }, |
| 732 | 726 | .local_val => scope = scope.cast(Scope.LocalVal).?.parent, |
| 733 | 727 | .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent, |
| ... | ... | @@ -735,18 +729,13 @@ fn breakExpr( |
| 735 | 729 | const label_name = try mod.identifierTokenString(parent_scope, break_label); |
| 736 | 730 | return mod.failTok(parent_scope, break_label, "label not found: '{s}'", .{label_name}); |
| 737 | 731 | } else { |
| 738 | | return mod.failTok(parent_scope, break_token, "break expression outside loop", .{}); |
| 732 | return mod.failNode(parent_scope, node, "break expression outside loop", .{}); |
| 739 | 733 | }, |
| 740 | 734 | } |
| 741 | 735 | } |
| 742 | 736 | } |
| 743 | 737 | |
| 744 | | fn continueExpr( |
| 745 | | mod: *Module, |
| 746 | | parent_scope: *Scope, |
| 747 | | rl: ResultLoc, |
| 748 | | node: ast.Node.Index, |
| 749 | | ) InnerError!zir.Inst.Ref { |
| 738 | fn continueExpr(mod: *Module, parent_scope: *Scope, node: ast.Node.Index) InnerError!zir.Inst.Ref { |
| 750 | 739 | if (true) @panic("TODO update for zir-memory-layout"); |
| 751 | 740 | const tree = parent_scope.tree(); |
| 752 | 741 | const node_datas = tree.nodes.items(.data); |
| ... | ... | @@ -776,10 +765,10 @@ fn continueExpr( |
| 776 | 765 | continue; |
| 777 | 766 | } |
| 778 | 767 | |
| 779 | | const result = try addZirInstTag(mod, parent_scope, src, .break_void, .{ |
| 768 | _ = try addZirInstTag(mod, parent_scope, src, .break_void, .{ |
| 780 | 769 | .block = continue_block, |
| 781 | 770 | }); |
| 782 | | return rvalue(mod, parent_scope, rl, result); |
| 771 | return zir.Inst.Ref.unreachable_value; |
| 783 | 772 | }, |
| 784 | 773 | .local_val => scope = scope.cast(Scope.LocalVal).?.parent, |
| 785 | 774 | .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent, |
| ... | ... | @@ -1769,11 +1758,11 @@ fn finishThenElseBlock( |
| 1769 | 1758 | switch (strat.tag) { |
| 1770 | 1759 | .break_void => { |
| 1771 | 1760 | if (!wzc.refIsNoReturn(then_result)) { |
| 1772 | | _ = try then_scope.addBreakVoid(block_scope, then_break_block, then_src); |
| 1761 | _ = try then_scope.addBreakVoid(then_break_block, then_src); |
| 1773 | 1762 | } |
| 1774 | 1763 | const elide_else = if (else_result != .none) wzc.refIsNoReturn(else_result) else false; |
| 1775 | 1764 | if (!elide_else) { |
| 1776 | | _ = try else_scope.addBreakVoid(block_scope, main_block, else_src); |
| 1765 | _ = try else_scope.addBreakVoid(main_block, else_src); |
| 1777 | 1766 | } |
| 1778 | 1767 | assert(!strat.elide_store_to_block_ptr_instructions); |
| 1779 | 1768 | try setCondBrPayload(condbr, cond, then_scope, else_scope); |
| ... | ... | @@ -1788,7 +1777,7 @@ fn finishThenElseBlock( |
| 1788 | 1777 | _ = try else_scope.addBreak(main_block, else_result); |
| 1789 | 1778 | } |
| 1790 | 1779 | } else { |
| 1791 | | _ = try else_scope.addBreakVoid(block_scope, main_block, else_src); |
| 1780 | _ = try else_scope.addBreakVoid(main_block, else_src); |
| 1792 | 1781 | } |
| 1793 | 1782 | if (strat.elide_store_to_block_ptr_instructions) { |
| 1794 | 1783 | try setCondBrPayloadElideBlockStorePtr(condbr, cond, then_scope, else_scope); |
| ... | ... | @@ -2799,7 +2788,8 @@ fn ret(mod: *Module, scope: *Scope, node: ast.Node.Index) InnerError!zir.Inst.Re |
| 2799 | 2788 | }; |
| 2800 | 2789 | break :operand try expr(mod, scope, rl, operand_node); |
| 2801 | 2790 | } else .void_value; |
| 2802 | | return gz.addUnNode(.ret_node, operand, node); |
| 2791 | _ = try gz.addUnNode(.ret_node, operand, node); |
| 2792 | return zir.Inst.Ref.unreachable_value; |
| 2803 | 2793 | } |
| 2804 | 2794 | |
| 2805 | 2795 | fn identifier( |