@@ -3313,8 +3313,8 @@ Tld *find_container_decl(CodeGen *g, ScopeDecls *decls_scope, Buf *name) {
3313
3313
for (size_t i = 0 ; i < decls_scope->use_decls .length ; i += 1 ) {
3314
3314
AstNode *use_decl_node = decls_scope->use_decls .at (i);
3315
3315
if (use_decl_node->data .use .resolution == TldResolutionUnresolved) {
3316
- preview_use_decl (g, use_decl_node);
3317
- resolve_use_decl (g, use_decl_node);
3316
+ preview_use_decl (g, use_decl_node, decls_scope );
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
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
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
3762
ConstExprValue *use_target_value = src_use_node->data .use .using_namespace_value ;
3763
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
3765
return ;
3766
3766
}
3767
3767
@@ -3775,12 +3775,12 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *
3775
3775
if (target_import->id != ZigTypeIdStruct) {
3776
3776
add_node_error (g, dst_use_node,
3777
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
3779
return ;
3780
3780
}
3781
3781
3782
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
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
3798
3799
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
3802
if (existing_entry) {
3803
3803
Tld *existing_decl = existing_entry->value ;
3804
3804
if (existing_decl != target_tld) {
@@ -3814,22 +3814,22 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *
3814
3814
for (size_t i = 0 ; i < get_container_scope (target_import)->use_decls .length ; i += 1 ) {
3815
3815
AstNode *use_decl_node = get_container_scope (target_import)->use_decls .at (i);
3816
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
3822
assert (node->type == NodeTypeUse);
3823
3823
3824
3824
if (node->data .use .resolution == TldResolutionOk ||
3825
3825
node->data .use .resolution == TldResolutionInvalid)
3826
3826
{
3827
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
3833
assert (node->type == NodeTypeUse);
3834
3834
3835
3835
if (node->data .use .resolution == TldResolutionOk ||
@@ -3839,11 +3839,11 @@ void preview_use_decl(CodeGen *g, AstNode *node) {
3839
3839
}
3840
3840
3841
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
3843
node->data .use .expr , g->builtin_types .entry_type , nullptr );
3844
3844
3845
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
3848
node->data .use .using_namespace_value = result;
3849
3849
}
@@ -3967,8 +3967,12 @@ void semantic_analyze(CodeGen *g) {
3967
3967
{
3968
3968
for (; g->use_queue_index < g->use_queue .length ; g->use_queue_index += 1 ) {
3969
3969
AstNode *use_decl_node = g->use_queue .at (g->use_queue_index );
3970
- preview_use_decl (g, use_decl_node);
3971
- resolve_use_decl (g, use_decl_node);
3970
+ // Get the top-level scope where `use` is used
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
3977
for (; g->resolve_queue_index < g->resolve_queue .length ; g->resolve_queue_index += 1 ) {
3974
3978
Tld *tld = g->resolve_queue .at (g->resolve_queue_index );
0 commit comments