@@ -23654,13 +23654,15 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa
23654
23654
return err;
23655
23655
23656
23656
// Loop through our declarations once to figure out how many declarations we will generate info for.
23657
+ // The unresolved declarations are collected in a separate queue to avoid
23658
+ // modifying decl_table while iterating over it
23659
+ ZigList<Tld*> resolve_decl_queue{};
23660
+
23657
23661
auto decl_it = decls_scope->decl_table.entry_iterator();
23658
23662
decltype(decls_scope->decl_table)::Entry *curr_entry = nullptr;
23659
- int declaration_count = 0;
23660
23663
23664
+ int declaration_count = 0;
23661
23665
while ((curr_entry = decl_it.next()) != nullptr) {
23662
- // If the declaration is unresolved, force it to be resolved again.
23663
- resolve_top_level_decl(ira->codegen, curr_entry->value, curr_entry->value->source_node, false);
23664
23666
if (curr_entry->value->resolution == TldResolutionInvalid) {
23665
23667
return ErrorSemanticAnalyzeFail;
23666
23668
}
@@ -23671,17 +23673,32 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa
23671
23673
}
23672
23674
23673
23675
// Skip comptime blocks and test functions.
23674
- if (curr_entry->value->id != TldIdCompTime) {
23675
- if (curr_entry->value->id == TldIdFn) {
23676
- ZigFn *fn_entry = ((TldFn *)curr_entry->value)->fn_entry;
23677
- if (fn_entry->is_test)
23678
- continue;
23679
- }
23676
+ if (curr_entry->value->id == TldIdCompTime)
23677
+ continue;
23678
+
23679
+ if (curr_entry->value->id == TldIdFn) {
23680
+ ZigFn *fn_entry = ((TldFn *)curr_entry->value)->fn_entry;
23681
+ if (fn_entry->is_test)
23682
+ continue;
23683
+ }
23680
23684
23681
- declaration_count += 1;
23685
+ declaration_count += 1;
23686
+
23687
+ // If the declaration is unresolved, force it to be resolved again.
23688
+ if (curr_entry->value->resolution == TldResolutionUnresolved)
23689
+ resolve_decl_queue.append(curr_entry->value);
23690
+ }
23691
+
23692
+ for (size_t i = 0; i < resolve_decl_queue.length; i++) {
23693
+ Tld *decl = resolve_decl_queue.at(i);
23694
+ resolve_top_level_decl(ira->codegen, decl, decl->source_node, false);
23695
+ if (decl->resolution == TldResolutionInvalid) {
23696
+ return ErrorSemanticAnalyzeFail;
23682
23697
}
23683
23698
}
23684
23699
23700
+ resolve_decl_queue.deinit();
23701
+
23685
23702
ZigValue *declaration_array = ira->codegen->pass1_arena->create<ZigValue>();
23686
23703
declaration_array->special = ConstValSpecialStatic;
23687
23704
declaration_array->type = get_array_type(ira->codegen, type_info_declaration_type, declaration_count, nullptr);
0 commit comments