| ... | @@ -769,15 +769,20 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn | ... | @@ -769,15 +769,20 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn |
| 769 | .array_init_comma, | 769 | .array_init_comma, |
| 770 | => return mod.failNode(scope, node, "TODO implement astgen.expr for array literals", .{}), | 770 | => return mod.failNode(scope, node, "TODO implement astgen.expr for array literals", .{}), |
| 771 | | 771 | |
| 772 | .struct_init_one, | 772 | .struct_init_one, .struct_init_one_comma => { |
| 773 | .struct_init_one_comma, | 773 | var fields: [1]ast.Node.Index = undefined; |
| 774 | .struct_init_dot_two, | 774 | return structInitExpr(gz, scope, rl, node, tree.structInitOne(&fields, node)); |
| 775 | .struct_init_dot_two_comma, | 775 | }, |
| | 776 | .struct_init_dot_two, .struct_init_dot_two_comma => { |
| | 777 | var fields: [2]ast.Node.Index = undefined; |
| | 778 | return structInitExpr(gz, scope, rl, node, tree.structInitDotTwo(&fields, node)); |
| | 779 | }, |
| 776 | .struct_init_dot, | 780 | .struct_init_dot, |
| 777 | .struct_init_dot_comma, | 781 | .struct_init_dot_comma, |
| | 782 | => return structInitExpr(gz, scope, rl, node, tree.structInitDot(node)), |
| 778 | .struct_init, | 783 | .struct_init, |
| 779 | .struct_init_comma, | 784 | .struct_init_comma, |
| 780 | => return mod.failNode(scope, node, "TODO implement astgen.expr for struct literals", .{}), | 785 | => return structInitExpr(gz, scope, rl, node, tree.structInit(node)), |
| 781 | | 786 | |
| 782 | .@"anytype" => return mod.failNode(scope, node, "TODO implement astgen.expr for .anytype", .{}), | 787 | .@"anytype" => return mod.failNode(scope, node, "TODO implement astgen.expr for .anytype", .{}), |
| 783 | .fn_proto_simple, | 788 | .fn_proto_simple, |
| ... | @@ -788,6 +793,53 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn | ... | @@ -788,6 +793,53 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn |
| 788 | } | 793 | } |
| 789 | } | 794 | } |
| 790 | | 795 | |
| | 796 | pub fn structInitExpr( |
| | 797 | gz: *GenZir, |
| | 798 | scope: *Scope, |
| | 799 | rl: ResultLoc, |
| | 800 | node: ast.Node.Index, |
| | 801 | struct_init: ast.full.StructInit, |
| | 802 | ) InnerError!zir.Inst.Ref { |
| | 803 | const tree = gz.tree(); |
| | 804 | const astgen = gz.astgen; |
| | 805 | const mod = astgen.mod; |
| | 806 | const gpa = mod.gpa; |
| | 807 | switch (rl) { |
| | 808 | .discard => return mod.failNode(scope, node, "TODO implement structInitExpr discard", .{}), |
| | 809 | .none => return mod.failNode(scope, node, "TODO implement structInitExpr none", .{}), |
| | 810 | .ref => unreachable, // struct literal not valid as l-value |
| | 811 | .ty => |ty_inst| { |
| | 812 | return mod.failNode(scope, node, "TODO implement structInitExpr ty", .{}); |
| | 813 | }, |
| | 814 | .ptr => |ptr_inst| { |
| | 815 | const field_ptr_list = try gpa.alloc(zir.Inst.Index, struct_init.ast.fields.len); |
| | 816 | defer gpa.free(field_ptr_list); |
| | 817 | |
| | 818 | for (struct_init.ast.fields) |field_init, i| { |
| | 819 | const name_token = tree.firstToken(field_init) - 2; |
| | 820 | const str_index = try gz.identAsString(name_token); |
| | 821 | const field_ptr = try gz.addPlNode(.field_ptr, field_init, zir.Inst.Field{ |
| | 822 | .lhs = ptr_inst, |
| | 823 | .field_name_start = str_index, |
| | 824 | }); |
| | 825 | field_ptr_list[i] = astgen.refToIndex(field_ptr).?; |
| | 826 | _ = try expr(gz, scope, .{ .ptr = field_ptr }, field_init); |
| | 827 | } |
| | 828 | const validate_inst = try gz.addPlNode(.validate_struct_init_ptr, node, zir.Inst.Block{ |
| | 829 | .body_len = @intCast(u32, field_ptr_list.len), |
| | 830 | }); |
| | 831 | try astgen.extra.appendSlice(gpa, field_ptr_list); |
| | 832 | return validate_inst; |
| | 833 | }, |
| | 834 | .inferred_ptr => |ptr_inst| { |
| | 835 | return mod.failNode(scope, node, "TODO implement structInitExpr inferred_ptr", .{}); |
| | 836 | }, |
| | 837 | .block_ptr => |block_gz| { |
| | 838 | return mod.failNode(scope, node, "TODO implement structInitExpr block", .{}); |
| | 839 | }, |
| | 840 | } |
| | 841 | } |
| | 842 | |
| 791 | pub fn comptimeExpr( | 843 | pub fn comptimeExpr( |
| 792 | gz: *GenZir, | 844 | gz: *GenZir, |
| 793 | scope: *Scope, | 845 | scope: *Scope, |
| ... | @@ -1285,6 +1337,7 @@ fn blockExprStmts( | ... | @@ -1285,6 +1337,7 @@ fn blockExprStmts( |
| 1285 | .resolve_inferred_alloc, | 1337 | .resolve_inferred_alloc, |
| 1286 | .repeat, | 1338 | .repeat, |
| 1287 | .repeat_inline, | 1339 | .repeat_inline, |
| | 1340 | .validate_struct_init_ptr, |
| 1288 | => break :b true, | 1341 | => break :b true, |
| 1289 | } | 1342 | } |
| 1290 | } else switch (maybe_unused_result) { | 1343 | } else switch (maybe_unused_result) { |
| ... | @@ -1959,7 +2012,8 @@ pub fn fieldAccess( | ... | @@ -1959,7 +2012,8 @@ pub fn fieldAccess( |
| 1959 | rl: ResultLoc, | 2012 | rl: ResultLoc, |
| 1960 | node: ast.Node.Index, | 2013 | node: ast.Node.Index, |
| 1961 | ) InnerError!zir.Inst.Ref { | 2014 | ) InnerError!zir.Inst.Ref { |
| 1962 | const mod = gz.astgen.mod; | 2015 | const astgen = gz.astgen; |
| | 2016 | const mod = astgen.mod; |
| 1963 | const tree = gz.tree(); | 2017 | const tree = gz.tree(); |
| 1964 | const main_tokens = tree.nodes.items(.main_token); | 2018 | const main_tokens = tree.nodes.items(.main_token); |
| 1965 | const node_datas = tree.nodes.items(.data); | 2019 | const node_datas = tree.nodes.items(.data); |
| ... | @@ -1967,10 +2021,7 @@ pub fn fieldAccess( | ... | @@ -1967,10 +2021,7 @@ pub fn fieldAccess( |
| 1967 | const object_node = node_datas[node].lhs; | 2021 | const object_node = node_datas[node].lhs; |
| 1968 | const dot_token = main_tokens[node]; | 2022 | const dot_token = main_tokens[node]; |
| 1969 | const field_ident = dot_token + 1; | 2023 | const field_ident = dot_token + 1; |
| 1970 | const string_bytes = &gz.astgen.string_bytes; | 2024 | const str_index = try gz.identAsString(field_ident); |
| 1971 | const str_index = @intCast(u32, string_bytes.items.len); | | |
| 1972 | try mod.appendIdentStr(scope, field_ident, string_bytes); | | |
| 1973 | try string_bytes.append(mod.gpa, 0); | | |
| 1974 | switch (rl) { | 2025 | switch (rl) { |
| 1975 | .ref => return gz.addPlNode(.field_ptr, node, zir.Inst.Field{ | 2026 | .ref => return gz.addPlNode(.field_ptr, node, zir.Inst.Field{ |
| 1976 | .lhs = try expr(gz, scope, .ref, object_node), | 2027 | .lhs = try expr(gz, scope, .ref, object_node), |
| ... | @@ -2031,11 +2082,7 @@ fn simpleStrTok( | ... | @@ -2031,11 +2082,7 @@ fn simpleStrTok( |
| 2031 | node: ast.Node.Index, | 2082 | node: ast.Node.Index, |
| 2032 | op_inst_tag: zir.Inst.Tag, | 2083 | op_inst_tag: zir.Inst.Tag, |
| 2033 | ) InnerError!zir.Inst.Ref { | 2084 | ) InnerError!zir.Inst.Ref { |
| 2034 | const mod = gz.astgen.mod; | 2085 | const str_index = try gz.identAsString(ident_token); |
| 2035 | const string_bytes = &gz.astgen.string_bytes; | | |
| 2036 | const str_index = @intCast(u32, string_bytes.items.len); | | |
| 2037 | try mod.appendIdentStr(scope, ident_token, string_bytes); | | |
| 2038 | try string_bytes.append(mod.gpa, 0); | | |
| 2039 | const result = try gz.addStrTok(op_inst_tag, str_index, ident_token); | 2086 | const result = try gz.addStrTok(op_inst_tag, str_index, ident_token); |
| 2040 | return rvalue(gz, scope, rl, result, node); | 2087 | return rvalue(gz, scope, rl, result, node); |
| 2041 | } | 2088 | } |