fix use decls not always working
This commit is contained in:
parent
fe3063e58c
commit
3075d8aee7
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
20
src/ir.cpp
20
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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user