Commit 3075d8aee7

Andrew Kelley <superjoe30@gmail.com>
2017-02-23 22:52:13
fix use decls not always working
1 parent fe3063e
Changed files (3)
src/analyze.cpp
@@ -2110,7 +2110,7 @@ VariableTableEntry *add_variable(CodeGen *g, AstNode *source_node, Scope *parent
                         buf_sprintf("variable shadows type '%s'", buf_ptr(&type->name)));
                 variable_entry->value.type = g->builtin_types.entry_invalid;
             } else {
-                Tld *tld = find_decl(parent_scope, name);
+                Tld *tld = find_decl(g, parent_scope, name);
                 if (tld && tld->id != TldIdVar) {
                     ErrorMsg *msg = add_node_error(g, source_node,
                             buf_sprintf("redefinition of '%s'", buf_ptr(name)));
@@ -2357,7 +2357,17 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry *
     return false;
 }
 
-Tld *find_decl(Scope *scope, Buf *name) {
+Tld *find_decl(CodeGen *g, Scope *scope, Buf *name) {
+    // we must resolve all the use decls
+    ImportTableEntry *import = get_scope_import(scope);
+    for (size_t i = 0; i < import->use_decls.length; i += 1) {
+        AstNode *use_decl_node = import->use_decls.at(i);
+        if (use_decl_node->data.use.resolution == TldResolutionUnresolved) {
+            preview_use_decl(g, use_decl_node);
+        }
+        resolve_use_decl(g, use_decl_node);
+    }
+
     while (scope) {
         if (scope->id == ScopeIdDecls) {
             ScopeDecls *decls_scope = (ScopeDecls *)scope;
src/analyze.hpp
@@ -49,7 +49,7 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package,
 // TODO move these over, these used to be static
 bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry *actual_type);
 VariableTableEntry *find_variable(CodeGen *g, Scope *orig_context, Buf *name);
-Tld *find_decl(Scope *scope, Buf *name);
+Tld *find_decl(CodeGen *g, Scope *scope, Buf *name);
 void resolve_top_level_decl(CodeGen *g, Tld *tld, bool pointer_only);
 bool type_is_codegen_pointer(TypeTableEntry *type);
 TypeTableEntry *validate_var_type(CodeGen *g, AstNode *source_node, TypeTableEntry *type_entry);
src/ir.cpp
@@ -3180,7 +3180,7 @@ static VariableTableEntry *create_local_var(CodeGen *codegen, AstNode *node, Sco
                         buf_sprintf("variable shadows type '%s'", buf_ptr(&type->name)));
                 variable_entry->value.type = codegen->builtin_types.entry_invalid;
             } else {
-                Tld *tld = find_decl(parent_scope, name);
+                Tld *tld = find_decl(codegen, parent_scope, name);
                 if (tld && tld->id != TldIdVar) {
                     ErrorMsg *msg = add_node_error(codegen, node,
                             buf_sprintf("redefinition of '%s'", buf_ptr(name)));
@@ -3676,7 +3676,7 @@ static IrInstruction *ir_gen_symbol(IrBuilder *irb, Scope *scope, AstNode *node,
             return ir_build_load_ptr(irb, scope, node, var_ptr);
     }
 
-    Tld *tld = find_decl(scope, variable_name);
+    Tld *tld = find_decl(irb->codegen, scope, variable_name);
     if (tld)
         return ir_gen_decl_ref(irb, node, tld, lval, scope);
 
@@ -4210,7 +4210,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
                     return irb->codegen->invalid_instruction;
                 }
                 Buf *variable_name = arg0_node->data.symbol_expr.symbol;
-                Tld *tld = find_decl(scope, variable_name);
+                Tld *tld = find_decl(irb->codegen, scope, variable_name);
                 if (!tld) {
                     add_node_error(irb->codegen, node, buf_sprintf("use of undeclared identifier '%s'",
                                 buf_ptr(variable_name)));
@@ -9333,19 +9333,7 @@ static TypeTableEntry *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstru
 
         ImportTableEntry *namespace_import = namespace_val->data.x_import;
 
-        Tld *tld = find_decl(&namespace_import->decls_scope->base, field_name);
-        if (!tld) {
-            // we must now resolve all the use decls
-            // TODO move this check to find_decl?
-            for (size_t i = 0; i < namespace_import->use_decls.length; i += 1) {
-                AstNode *use_decl_node = namespace_import->use_decls.at(i);
-                if (use_decl_node->data.use.resolution == TldResolutionUnresolved) {
-                    preview_use_decl(ira->codegen, use_decl_node);
-                }
-                resolve_use_decl(ira->codegen, use_decl_node);
-            }
-            tld = find_decl(&namespace_import->decls_scope->base, field_name);
-        }
+        Tld *tld = find_decl(ira->codegen, &namespace_import->decls_scope->base, field_name);
         if (tld) {
             if (tld->visib_mod == VisibModPrivate &&
                 tld->import != source_node->owner)