| ... | @@ -3548,7 +3548,7 @@ pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator { | ... | @@ -3548,7 +3548,7 @@ pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator { |
| 3548 | const datas = zir.instructions.items(.data); | 3548 | const datas = zir.instructions.items(.data); |
| 3549 | switch (tags[@intFromEnum(decl_inst)]) { | 3549 | switch (tags[@intFromEnum(decl_inst)]) { |
| 3550 | // Functions are allowed and yield no iterations. | 3550 | // Functions are allowed and yield no iterations. |
| 3551 | // There is one case matching this in the extended instruction set below. | 3551 | // This is because they are returned by `findDecls`. |
| 3552 | .func, .func_inferred, .func_fancy => return .{ | 3552 | .func, .func_inferred, .func_fancy => return .{ |
| 3553 | .extra_index = undefined, | 3553 | .extra_index = undefined, |
| 3554 | .decls_remaining = 0, | 3554 | .decls_remaining = 0, |
| ... | @@ -3558,6 +3558,13 @@ pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator { | ... | @@ -3558,6 +3558,13 @@ pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator { |
| 3558 | .extended => { | 3558 | .extended => { |
| 3559 | const extended = datas[@intFromEnum(decl_inst)].extended; | 3559 | const extended = datas[@intFromEnum(decl_inst)].extended; |
| 3560 | switch (extended.opcode) { | 3560 | switch (extended.opcode) { |
| | 3561 | // Reifications are allowed and yield no iterations. |
| | 3562 | // This is because they are returned by `findDecls`. |
| | 3563 | .reify => return .{ |
| | 3564 | .extra_index = undefined, |
| | 3565 | .decls_remaining = 0, |
| | 3566 | .zir = zir, |
| | 3567 | }, |
| 3561 | .struct_decl => { | 3568 | .struct_decl => { |
| 3562 | const small: Inst.StructDecl.Small = @bitCast(extended.small); | 3569 | const small: Inst.StructDecl.Small = @bitCast(extended.small); |
| 3563 | var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.StructDecl).Struct.fields.len); | 3570 | var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.StructDecl).Struct.fields.len); |
| ... | @@ -3690,6 +3697,17 @@ pub fn findDecls(zir: Zir, gpa: Allocator, list: *std.ArrayListUnmanaged(Inst.In | ... | @@ -3690,6 +3697,17 @@ pub fn findDecls(zir: Zir, gpa: Allocator, list: *std.ArrayListUnmanaged(Inst.In |
| 3690 | if (bodies.addrspace_body) |b| try zir.findDeclsBody(gpa, list, &found_defers, b); | 3697 | if (bodies.addrspace_body) |b| try zir.findDeclsBody(gpa, list, &found_defers, b); |
| 3691 | } | 3698 | } |
| 3692 | | 3699 | |
| | 3700 | /// Like `findDecls`, but only considers the `main_struct_inst` instruction. This may return more than |
| | 3701 | /// just that instruction because it will also traverse fields. |
| | 3702 | pub fn findDeclsRoot(zir: Zir, gpa: Allocator, list: *std.ArrayListUnmanaged(Inst.Index)) !void { |
| | 3703 | list.clearRetainingCapacity(); |
| | 3704 | |
| | 3705 | var found_defers: std.AutoHashMapUnmanaged(u32, void) = .{}; |
| | 3706 | defer found_defers.deinit(gpa); |
| | 3707 | |
| | 3708 | try zir.findDeclsInner(gpa, list, &found_defers, .main_struct_inst); |
| | 3709 | } |
| | 3710 | |
| 3693 | fn findDeclsInner( | 3711 | fn findDeclsInner( |
| 3694 | zir: Zir, | 3712 | zir: Zir, |
| 3695 | gpa: Allocator, | 3713 | gpa: Allocator, |