| ... | ... | @@ -828,7 +828,13 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 828 | 828 | |
| 829 | 829 | .slice_open => { |
| 830 | 830 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 831 | |
| 832 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 833 | const line = gz.astgen.source_line - gz.decl_line; |
| 834 | const column = gz.astgen.source_column; |
| 835 | |
| 831 | 836 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[node].rhs); |
| 837 | try emitDbgStmt(gz, line, column); |
| 832 | 838 | const result = try gz.addPlNode(.slice_start, node, Zir.Inst.SliceStart{ |
| 833 | 839 | .lhs = lhs, |
| 834 | 840 | .start = start, |
| ... | ... | @@ -837,9 +843,15 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 837 | 843 | }, |
| 838 | 844 | .slice => { |
| 839 | 845 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 846 | |
| 847 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 848 | const line = gz.astgen.source_line - gz.decl_line; |
| 849 | const column = gz.astgen.source_column; |
| 850 | |
| 840 | 851 | const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice); |
| 841 | 852 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start); |
| 842 | 853 | const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end); |
| 854 | try emitDbgStmt(gz, line, column); |
| 843 | 855 | const result = try gz.addPlNode(.slice_end, node, Zir.Inst.SliceEnd{ |
| 844 | 856 | .lhs = lhs, |
| 845 | 857 | .start = start, |
| ... | ... | @@ -849,10 +861,16 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 849 | 861 | }, |
| 850 | 862 | .slice_sentinel => { |
| 851 | 863 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 864 | |
| 865 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 866 | const line = gz.astgen.source_line - gz.decl_line; |
| 867 | const column = gz.astgen.source_column; |
| 868 | |
| 852 | 869 | const extra = tree.extraData(node_datas[node].rhs, Ast.Node.SliceSentinel); |
| 853 | 870 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start); |
| 854 | 871 | const end = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none; |
| 855 | 872 | const sentinel = try expr(gz, scope, .{ .rl = .none }, extra.sentinel); |
| 873 | try emitDbgStmt(gz, line, column); |
| 856 | 874 | const result = try gz.addPlNode(.slice_sentinel, node, Zir.Inst.SliceSentinel{ |
| 857 | 875 | .lhs = lhs, |
| 858 | 876 | .start = start, |
| ... | ... | @@ -883,16 +901,26 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 883 | 901 | return rvalue(gz, ri, result, node); |
| 884 | 902 | }, |
| 885 | 903 | .unwrap_optional => switch (ri.rl) { |
| 886 | | .ref => return gz.addUnNode( |
| 887 | | .optional_payload_safe_ptr, |
| 888 | | try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs), |
| 889 | | node, |
| 890 | | ), |
| 891 | | else => return rvalue(gz, ri, try gz.addUnNode( |
| 892 | | .optional_payload_safe, |
| 893 | | try expr(gz, scope, .{ .rl = .none }, node_datas[node].lhs), |
| 894 | | node, |
| 895 | | ), node), |
| 904 | .ref => { |
| 905 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 906 | |
| 907 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 908 | const line = gz.astgen.source_line - gz.decl_line; |
| 909 | const column = gz.astgen.source_column; |
| 910 | try emitDbgStmt(gz, line, column); |
| 911 | |
| 912 | return gz.addUnNode(.optional_payload_safe_ptr, lhs, node); |
| 913 | }, |
| 914 | else => { |
| 915 | const lhs = try expr(gz, scope, .{ .rl = .none }, node_datas[node].lhs); |
| 916 | |
| 917 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 918 | const line = gz.astgen.source_line - gz.decl_line; |
| 919 | const column = gz.astgen.source_column; |
| 920 | try emitDbgStmt(gz, line, column); |
| 921 | |
| 922 | return rvalue(gz, ri, try gz.addUnNode(.optional_payload_safe, lhs, node), node); |
| 923 | }, |
| 896 | 924 | }, |
| 897 | 925 | .block_two, .block_two_semicolon => { |
| 898 | 926 | const statements = [2]Ast.Node.Index{ node_datas[node].lhs, node_datas[node].rhs }; |
| ... | ... | @@ -3241,10 +3269,27 @@ fn assignOp( |
| 3241 | 3269 | const node_datas = tree.nodes.items(.data); |
| 3242 | 3270 | |
| 3243 | 3271 | const lhs_ptr = try lvalExpr(gz, scope, node_datas[infix_node].lhs); |
| 3272 | |
| 3273 | var line: u32 = undefined; |
| 3274 | var column: u32 = undefined; |
| 3275 | switch (op_inst_tag) { |
| 3276 | .add, .sub, .mul, .div, .mod_rem => { |
| 3277 | maybeAdvanceSourceCursorToMainToken(gz, infix_node); |
| 3278 | line = gz.astgen.source_line - gz.decl_line; |
| 3279 | column = gz.astgen.source_column; |
| 3280 | }, |
| 3281 | else => {}, |
| 3282 | } |
| 3244 | 3283 | const lhs = try gz.addUnNode(.load, lhs_ptr, infix_node); |
| 3245 | 3284 | const lhs_type = try gz.addUnNode(.typeof, lhs, infix_node); |
| 3246 | 3285 | const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = lhs_type } }, node_datas[infix_node].rhs); |
| 3247 | 3286 | |
| 3287 | switch (op_inst_tag) { |
| 3288 | .add, .sub, .mul, .div, .mod_rem => { |
| 3289 | try emitDbgStmt(gz, line, column); |
| 3290 | }, |
| 3291 | else => {}, |
| 3292 | } |
| 3248 | 3293 | const result = try gz.addPlNode(op_inst_tag, infix_node, Zir.Inst.Bin{ |
| 3249 | 3294 | .lhs = lhs, |
| 3250 | 3295 | .rhs = rhs, |
| ... | ... | @@ -5475,9 +5520,15 @@ fn addFieldAccess( |
| 5475 | 5520 | const dot_token = main_tokens[node]; |
| 5476 | 5521 | const field_ident = dot_token + 1; |
| 5477 | 5522 | const str_index = try astgen.identAsString(field_ident); |
| 5523 | const lhs = try expr(gz, scope, lhs_ri, object_node); |
| 5524 | |
| 5525 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 5526 | const line = gz.astgen.source_line - gz.decl_line; |
| 5527 | const column = gz.astgen.source_column; |
| 5528 | try emitDbgStmt(gz, line, column); |
| 5478 | 5529 | |
| 5479 | 5530 | return gz.addPlNode(tag, node, Zir.Inst.Field{ |
| 5480 | | .lhs = try expr(gz, scope, lhs_ri, object_node), |
| 5531 | .lhs = lhs, |
| 5481 | 5532 | .field_name_start = str_index, |
| 5482 | 5533 | }); |
| 5483 | 5534 | } |
| ... | ... | @@ -5488,18 +5539,33 @@ fn arrayAccess( |
| 5488 | 5539 | ri: ResultInfo, |
| 5489 | 5540 | node: Ast.Node.Index, |
| 5490 | 5541 | ) InnerError!Zir.Inst.Ref { |
| 5491 | | const astgen = gz.astgen; |
| 5492 | | const tree = astgen.tree; |
| 5542 | const tree = gz.astgen.tree; |
| 5493 | 5543 | const node_datas = tree.nodes.items(.data); |
| 5494 | 5544 | switch (ri.rl) { |
| 5495 | | .ref => return gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ |
| 5496 | | .lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs), |
| 5497 | | .rhs = try expr(gz, scope, .{ .rl = .{ .ty = .usize_type } }, node_datas[node].rhs), |
| 5498 | | }), |
| 5499 | | else => return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ |
| 5500 | | .lhs = try expr(gz, scope, .{ .rl = .none }, node_datas[node].lhs), |
| 5501 | | .rhs = try expr(gz, scope, .{ .rl = .{ .ty = .usize_type } }, node_datas[node].rhs), |
| 5502 | | }), node), |
| 5545 | .ref => { |
| 5546 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 5547 | |
| 5548 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 5549 | const line = gz.astgen.source_line - gz.decl_line; |
| 5550 | const column = gz.astgen.source_column; |
| 5551 | |
| 5552 | const rhs = try expr(gz, scope, .{ .rl = .{ .ty = .usize_type } }, node_datas[node].rhs); |
| 5553 | try emitDbgStmt(gz, line, column); |
| 5554 | |
| 5555 | return gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }); |
| 5556 | }, |
| 5557 | else => { |
| 5558 | const lhs = try expr(gz, scope, .{ .rl = .none }, node_datas[node].lhs); |
| 5559 | |
| 5560 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 5561 | const line = gz.astgen.source_line - gz.decl_line; |
| 5562 | const column = gz.astgen.source_column; |
| 5563 | |
| 5564 | const rhs = try expr(gz, scope, .{ .rl = .{ .ty = .usize_type } }, node_datas[node].rhs); |
| 5565 | try emitDbgStmt(gz, line, column); |
| 5566 | |
| 5567 | return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node); |
| 5568 | }, |
| 5503 | 5569 | } |
| 5504 | 5570 | } |
| 5505 | 5571 | |
| ... | ... | @@ -5514,10 +5580,26 @@ fn simpleBinOp( |
| 5514 | 5580 | const tree = astgen.tree; |
| 5515 | 5581 | const node_datas = tree.nodes.items(.data); |
| 5516 | 5582 | |
| 5517 | | const result = try gz.addPlNode(op_inst_tag, node, Zir.Inst.Bin{ |
| 5518 | | .lhs = try reachableExpr(gz, scope, .{ .rl = .none }, node_datas[node].lhs, node), |
| 5519 | | .rhs = try reachableExpr(gz, scope, .{ .rl = .none }, node_datas[node].rhs, node), |
| 5520 | | }); |
| 5583 | const lhs = try reachableExpr(gz, scope, .{ .rl = .none }, node_datas[node].lhs, node); |
| 5584 | var line: u32 = undefined; |
| 5585 | var column: u32 = undefined; |
| 5586 | switch (op_inst_tag) { |
| 5587 | .add, .sub, .mul, .div, .mod_rem => { |
| 5588 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 5589 | line = gz.astgen.source_line - gz.decl_line; |
| 5590 | column = gz.astgen.source_column; |
| 5591 | }, |
| 5592 | else => {}, |
| 5593 | } |
| 5594 | const rhs = try reachableExpr(gz, scope, .{ .rl = .none }, node_datas[node].rhs, node); |
| 5595 | |
| 5596 | switch (op_inst_tag) { |
| 5597 | .add, .sub, .mul, .div, .mod_rem => { |
| 5598 | try emitDbgStmt(gz, line, column); |
| 5599 | }, |
| 5600 | else => {}, |
| 5601 | } |
| 5602 | const result = try gz.addPlNode(op_inst_tag, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }); |
| 5521 | 5603 | return rvalue(gz, ri, result, node); |
| 5522 | 5604 | } |
| 5523 | 5605 | |
| ... | ... | @@ -7858,9 +7940,7 @@ fn builtinCall( |
| 7858 | 7940 | }, |
| 7859 | 7941 | |
| 7860 | 7942 | .src => { |
| 7861 | | const token_starts = tree.tokens.items(.start); |
| 7862 | | const node_start = token_starts[tree.firstToken(node)]; |
| 7863 | | astgen.advanceSourceCursor(node_start); |
| 7943 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 7864 | 7944 | const result = try gz.addExtendedPayload(.builtin_src, Zir.Inst.Src{ |
| 7865 | 7945 | .node = gz.nodeIndexToRelative(node), |
| 7866 | 7946 | .line = astgen.source_line, |
| ... | ... | @@ -7975,6 +8055,8 @@ fn builtinCall( |
| 7975 | 8055 | return rvalue(gz, ri, result, node); |
| 7976 | 8056 | }, |
| 7977 | 8057 | .err_set_cast => { |
| 8058 | try emitDbgNode(gz, node); |
| 8059 | |
| 7978 | 8060 | const result = try gz.addExtendedPayload(.err_set_cast, Zir.Inst.BinNode{ |
| 7979 | 8061 | .lhs = try typeExpr(gz, scope, params[0]), |
| 7980 | 8062 | .rhs = try expr(gz, scope, .{ .rl = .none }, params[1]), |
| ... | ... | @@ -8280,6 +8362,8 @@ fn typeCast( |
| 8280 | 8362 | rhs_node: Ast.Node.Index, |
| 8281 | 8363 | tag: Zir.Inst.Tag, |
| 8282 | 8364 | ) InnerError!Zir.Inst.Ref { |
| 8365 | try emitDbgNode(gz, node); |
| 8366 | |
| 8283 | 8367 | const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{ |
| 8284 | 8368 | .lhs = try typeExpr(gz, scope, lhs_node), |
| 8285 | 8369 | .rhs = try expr(gz, scope, .{ .rl = .none }, rhs_node), |
| ... | ... | @@ -8309,6 +8393,10 @@ fn simpleUnOp( |
| 8309 | 8393 | operand_node: Ast.Node.Index, |
| 8310 | 8394 | tag: Zir.Inst.Tag, |
| 8311 | 8395 | ) InnerError!Zir.Inst.Ref { |
| 8396 | switch (tag) { |
| 8397 | .tag_name, .error_name, .ptr_to_int => try emitDbgNode(gz, node), |
| 8398 | else => {}, |
| 8399 | } |
| 8312 | 8400 | const operand = try expr(gz, scope, operand_ri, operand_node); |
| 8313 | 8401 | const result = try gz.addUnNode(tag, operand, node); |
| 8314 | 8402 | return rvalue(gz, ri, result, node); |
| ... | ... | @@ -8381,6 +8469,8 @@ fn divBuiltin( |
| 8381 | 8469 | rhs_node: Ast.Node.Index, |
| 8382 | 8470 | tag: Zir.Inst.Tag, |
| 8383 | 8471 | ) InnerError!Zir.Inst.Ref { |
| 8472 | try emitDbgNode(gz, node); |
| 8473 | |
| 8384 | 8474 | const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{ |
| 8385 | 8475 | .lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node), |
| 8386 | 8476 | .rhs = try expr(gz, scope, .{ .rl = .none }, rhs_node), |
| ... | ... | @@ -8434,8 +8524,15 @@ fn shiftOp( |
| 8434 | 8524 | tag: Zir.Inst.Tag, |
| 8435 | 8525 | ) InnerError!Zir.Inst.Ref { |
| 8436 | 8526 | const lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node); |
| 8527 | |
| 8528 | maybeAdvanceSourceCursorToMainToken(gz, node); |
| 8529 | const line = gz.astgen.source_line - gz.decl_line; |
| 8530 | const column = gz.astgen.source_column; |
| 8531 | |
| 8437 | 8532 | const log2_int_type = try gz.addUnNode(.typeof_log2_int_type, lhs, lhs_node); |
| 8438 | 8533 | const rhs = try expr(gz, scope, .{ .rl = .{ .ty = log2_int_type }, .ctx = .shift_op }, rhs_node); |
| 8534 | |
| 8535 | try emitDbgStmt(gz, line, column); |
| 8439 | 8536 | const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{ |
| 8440 | 8537 | .lhs = lhs, |
| 8441 | 8538 | .rhs = rhs, |
| ... | ... | @@ -12065,6 +12162,18 @@ fn detectLocalShadowing( |
| 12065 | 12162 | }; |
| 12066 | 12163 | } |
| 12067 | 12164 | |
| 12165 | /// Advances the source cursor to the main token of `node` if not in comptime scope. |
| 12166 | /// Usually paired with `emitDbgStmt`. |
| 12167 | fn maybeAdvanceSourceCursorToMainToken(gz: *GenZir, node: Ast.Node.Index) void { |
| 12168 | if (gz.force_comptime) return; |
| 12169 | |
| 12170 | const tree = gz.astgen.tree; |
| 12171 | const token_starts = tree.tokens.items(.start); |
| 12172 | const main_tokens = tree.nodes.items(.main_token); |
| 12173 | const node_start = token_starts[main_tokens[node]]; |
| 12174 | gz.astgen.advanceSourceCursor(node_start); |
| 12175 | } |
| 12176 | |
| 12068 | 12177 | /// Advances the source cursor to the beginning of `node`. |
| 12069 | 12178 | fn advanceSourceCursorToNode(astgen: *AstGen, node: Ast.Node.Index) void { |
| 12070 | 12179 | const tree = astgen.tree; |