| ... | @@ -849,10 +849,25 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE | ... | @@ -849,10 +849,25 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 849 | return rvalue(gz, ri, result, node); | 849 | return rvalue(gz, ri, result, node); |
| 850 | }, | 850 | }, |
| 851 | .slice => { | 851 | .slice => { |
| | 852 | const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice); |
| | 853 | const lhs_node = node_datas[node].lhs; |
| | 854 | if (node_tags[lhs_node] == .slice_open and nodeIsTriviallyZero(tree, extra.start)) { |
| | 855 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[lhs_node].lhs); |
| | 856 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[lhs_node].rhs); |
| | 857 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| | 858 | const len = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none; |
| | 859 | try emitDbgStmt(gz, cursor); |
| | 860 | const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{ |
| | 861 | .lhs = lhs, |
| | 862 | .start = start, |
| | 863 | .len = len, |
| | 864 | .start_src_node_offset = gz.nodeIndexToRelative(lhs_node), |
| | 865 | }); |
| | 866 | return rvalue(gz, ri, result, node); |
| | 867 | } |
| 852 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); | 868 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 853 | | 869 | |
| 854 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); | 870 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 855 | const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice); | | |
| 856 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start); | 871 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start); |
| 857 | const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end); | 872 | const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end); |
| 858 | try emitDbgStmt(gz, cursor); | 873 | try emitDbgStmt(gz, cursor); |