| ... | @@ -3313,8 +3313,8 @@ Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { | ... | @@ -3313,8 +3313,8 @@ Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) { |
| 3313 | for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { | 3313 | for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) { |
| 3314 | AstNode *use_decl_node = decls_scope->use_decls.at(i); | 3314 | AstNode *use_decl_node = decls_scope->use_decls.at(i); |
| 3315 | if (use_decl_node->data.use.resolution == TldResolutionUnresolved) { | 3315 | if (use_decl_node->data.use.resolution == TldResolutionUnresolved) { |
| 3316 | preview_use_decl(g, use_decl_node); | 3316 | preview_use_decl(g, use_decl_node, decls_scope); |
| 3317 | resolve_use_decl(g, use_decl_node); | 3317 | resolve_use_decl(g, use_decl_node, decls_scope); |
| 3318 | } | 3318 | } |
| 3319 | } | 3319 | } |
| 3320 | | 3320 | |
| ... | @@ -3754,14 +3754,14 @@ static void analyze_fn_body(CodeGen *g, ZigFn *fn_table_entry) { | ... | @@ -3754,14 +3754,14 @@ static void analyze_fn_body(CodeGen *g, ZigFn *fn_table_entry) { |
| 3754 | analyze_fn_ir(g, fn_table_entry, return_type_node); | 3754 | analyze_fn_ir(g, fn_table_entry, return_type_node); |
| 3755 | } | 3755 | } |
| 3756 | | 3756 | |
| 3757 | static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *dst_use_node) { | 3757 | static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *dst_use_node, ScopeDecls* decls_scope) { |
| 3758 | if (src_use_node->data.use.resolution == TldResolutionUnresolved) { | 3758 | if (src_use_node->data.use.resolution == TldResolutionUnresolved) { |
| 3759 | preview_use_decl(g, src_use_node); | 3759 | preview_use_decl(g, src_use_node, decls_scope); |
| 3760 | } | 3760 | } |
| 3761 | | 3761 | |
| 3762 | ConstExprValue *use_target_value = src_use_node->data.use.using_namespace_value; | 3762 | ConstExprValue *use_target_value = src_use_node->data.use.using_namespace_value; |
| 3763 | if (type_is_invalid(use_target_value->type)) { | 3763 | if (type_is_invalid(use_target_value->type)) { |
| 3764 | get_container_scope(dst_use_node->owner)->any_imports_failed = true; | 3764 | decls_scope->any_imports_failed = true; |
| 3765 | return; | 3765 | return; |
| 3766 | } | 3766 | } |
| 3767 | | 3767 | |
| ... | @@ -3775,12 +3775,12 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode * | ... | @@ -3775,12 +3775,12 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode * |
| 3775 | if (target_import->id != ZigTypeIdStruct) { | 3775 | if (target_import->id != ZigTypeIdStruct) { |
| 3776 | add_node_error(g, dst_use_node, | 3776 | add_node_error(g, dst_use_node, |
| 3777 | buf_sprintf("expected struct, found '%s'", buf_ptr(&target_import->name))); | 3777 | buf_sprintf("expected struct, found '%s'", buf_ptr(&target_import->name))); |
| 3778 | get_container_scope(dst_use_node->owner)->any_imports_failed = true; | 3778 | decls_scope->any_imports_failed = true; |
| 3779 | return; | 3779 | return; |
| 3780 | } | 3780 | } |
| 3781 | | 3781 | |
| 3782 | if (get_container_scope(target_import)->any_imports_failed) { | 3782 | if (get_container_scope(target_import)->any_imports_failed) { |
| 3783 | get_container_scope(dst_use_node->owner)->any_imports_failed = true; | 3783 | decls_scope->any_imports_failed = true; |
| 3784 | } | 3784 | } |
| 3785 | | 3785 | |
| 3786 | auto it = get_container_scope(target_import)->decl_table.entry_iterator(); | 3786 | auto it = get_container_scope(target_import)->decl_table.entry_iterator(); |
| ... | @@ -3798,7 +3798,7 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode * | ... | @@ -3798,7 +3798,7 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode * |
| 3798 | | 3798 | |
| 3799 | Buf *target_tld_name = entry->key; | 3799 | Buf *target_tld_name = entry->key; |
| 3800 | | 3800 | |
| 3801 | auto existing_entry = get_container_scope(dst_use_node->owner)->decl_table.put_unique(target_tld_name, target_tld); | 3801 | auto existing_entry = decls_scope->decl_table.put_unique(target_tld_name, target_tld); |
| 3802 | if (existing_entry) { | 3802 | if (existing_entry) { |
| 3803 | Tld *existing_decl = existing_entry->value; | 3803 | Tld *existing_decl = existing_entry->value; |
| 3804 | if (existing_decl != target_tld) { | 3804 | if (existing_decl != target_tld) { |
| ... | @@ -3814,11 +3814,11 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode * | ... | @@ -3814,11 +3814,11 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode * |
| 3814 | for (size_t i = 0; i < get_container_scope(target_import)->use_decls.length; i += 1) { | 3814 | for (size_t i = 0; i < get_container_scope(target_import)->use_decls.length; i += 1) { |
| 3815 | AstNode *use_decl_node = get_container_scope(target_import)->use_decls.at(i); | 3815 | AstNode *use_decl_node = get_container_scope(target_import)->use_decls.at(i); |
| 3816 | if (use_decl_node->data.use.visib_mod != VisibModPrivate) | 3816 | if (use_decl_node->data.use.visib_mod != VisibModPrivate) |
| 3817 | add_symbols_from_import(g, use_decl_node, dst_use_node); | 3817 | add_symbols_from_import(g, use_decl_node, dst_use_node, decls_scope); |
| 3818 | } | 3818 | } |
| 3819 | } | 3819 | } |
| 3820 | | 3820 | |
| 3821 | void resolve_use_decl(CodeGen *g, AstNode *node) { | 3821 | void resolve_use_decl(CodeGen *g, AstNode *node, ScopeDecls *decls_scope) { |
| 3822 | assert(node->type == NodeTypeUse); | 3822 | assert(node->type == NodeTypeUse); |
| 3823 | | 3823 | |
| 3824 | if (node->data.use.resolution == TldResolutionOk || | 3824 | if (node->data.use.resolution == TldResolutionOk || |
| ... | @@ -3826,10 +3826,10 @@ void resolve_use_decl(CodeGen *g, AstNode *node) { | ... | @@ -3826,10 +3826,10 @@ void resolve_use_decl(CodeGen *g, AstNode *node) { |
| 3826 | { | 3826 | { |
| 3827 | return; | 3827 | return; |
| 3828 | } | 3828 | } |
| 3829 | add_symbols_from_import(g, node, node); | 3829 | add_symbols_from_import(g, node, node, decls_scope); |
| 3830 | } | 3830 | } |
| 3831 | | 3831 | |
| 3832 | void preview_use_decl(CodeGen *g, AstNode *node) { | 3832 | void preview_use_decl(CodeGen *g, AstNode *node, ScopeDecls *decls_scope) { |
| 3833 | assert(node->type == NodeTypeUse); | 3833 | assert(node->type == NodeTypeUse); |
| 3834 | | 3834 | |
| 3835 | if (node->data.use.resolution == TldResolutionOk || | 3835 | if (node->data.use.resolution == TldResolutionOk || |
| ... | @@ -3839,11 +3839,11 @@ void preview_use_decl(CodeGen *g, AstNode *node) { | ... | @@ -3839,11 +3839,11 @@ void preview_use_decl(CodeGen *g, AstNode *node) { |
| 3839 | } | 3839 | } |
| 3840 | | 3840 | |
| 3841 | node->data.use.resolution = TldResolutionResolving; | 3841 | node->data.use.resolution = TldResolutionResolving; |
| 3842 | ConstExprValue *result = analyze_const_value(g, &get_container_scope(node->owner)->base, | 3842 | ConstExprValue *result = analyze_const_value(g, &decls_scope->base, |
| 3843 | node->data.use.expr, g->builtin_types.entry_type, nullptr); | 3843 | node->data.use.expr, g->builtin_types.entry_type, nullptr); |
| 3844 | | 3844 | |
| 3845 | if (type_is_invalid(result->type)) | 3845 | if (type_is_invalid(result->type)) |
| 3846 | get_container_scope(node->owner)->any_imports_failed = true; | 3846 | decls_scope->any_imports_failed = true; |
| 3847 | | 3847 | |
| 3848 | node->data.use.using_namespace_value = result; | 3848 | node->data.use.using_namespace_value = result; |
| 3849 | } | 3849 | } |
| ... | @@ -3967,8 +3967,12 @@ void semantic_analyze(CodeGen *g) { | ... | @@ -3967,8 +3967,12 @@ void semantic_analyze(CodeGen *g) { |
| 3967 | { | 3967 | { |
| 3968 | for (; g->use_queue_index < g->use_queue.length; g->use_queue_index += 1) { | 3968 | for (; g->use_queue_index < g->use_queue.length; g->use_queue_index += 1) { |
| 3969 | AstNode *use_decl_node = g->use_queue.at(g->use_queue_index); | 3969 | AstNode *use_decl_node = g->use_queue.at(g->use_queue_index); |
| 3970 | preview_use_decl(g, use_decl_node); | 3970 | // Get the top-level scope where `use` is used |
| 3971 | resolve_use_decl(g, use_decl_node); | 3971 | ScopeDecls *decls_scope = get_container_scope(use_decl_node->owner); |
| | 3972 | if (use_decl_node->data.use.resolution == TldResolutionUnresolved) { |
| | 3973 | preview_use_decl(g, use_decl_node, decls_scope); |
| | 3974 | resolve_use_decl(g, use_decl_node, decls_scope); |
| | 3975 | } |
| 3972 | } | 3976 | } |
| 3973 | for (; g->resolve_queue_index < g->resolve_queue.length; g->resolve_queue_index += 1) { | 3977 | for (; g->resolve_queue_index < g->resolve_queue.length; g->resolve_queue_index += 1) { |
| 3974 | Tld *tld = g->resolve_queue.at(g->resolve_queue_index); | 3978 | Tld *tld = g->resolve_queue.at(g->resolve_queue_index); |