| ... | @@ -3091,7 +3091,7 @@ void init_tld(Tld *tld, TldId id, Buf *name, VisibMod visib_mod, AstNode *source | ... | @@ -3091,7 +3091,7 @@ void init_tld(Tld *tld, TldId id, Buf *name, VisibMod visib_mod, AstNode *source |
| 3091 | | 3091 | |
| 3092 | void update_compile_var(CodeGen *g, Buf *name, ConstExprValue *value) { | 3092 | void update_compile_var(CodeGen *g, Buf *name, ConstExprValue *value) { |
| 3093 | Tld *tld = get_container_scope(g->compile_var_import)->decl_table.get(name); | 3093 | Tld *tld = get_container_scope(g->compile_var_import)->decl_table.get(name); |
| 3094 | resolve_top_level_decl(g, tld, tld->source_node); | 3094 | resolve_top_level_decl(g, tld, tld->source_node, false); |
| 3095 | assert(tld->id == TldIdVar); | 3095 | assert(tld->id == TldIdVar); |
| 3096 | TldVar *tld_var = (TldVar *)tld; | 3096 | TldVar *tld_var = (TldVar *)tld; |
| 3097 | tld_var->var->const_value = value; | 3097 | tld_var->var->const_value = value; |
| ... | @@ -3333,7 +3333,7 @@ ZigVar *add_variable(CodeGen *g, AstNode *source_node, Scope *parent_scope, Buf | ... | @@ -3333,7 +3333,7 @@ ZigVar *add_variable(CodeGen *g, AstNode *source_node, Scope *parent_scope, Buf |
| 3333 | return variable_entry; | 3333 | return variable_entry; |
| 3334 | } | 3334 | } |
| 3335 | | 3335 | |
| 3336 | static void resolve_decl_var(CodeGen *g, TldVar *tld_var) { | 3336 | static void resolve_decl_var(CodeGen *g, TldVar *tld_var, bool allow_lazy) { |
| 3337 | AstNode *source_node = tld_var->base.source_node; | 3337 | AstNode *source_node = tld_var->base.source_node; |
| 3338 | AstNodeVariableDeclaration *var_decl = &source_node->data.variable_declaration; | 3338 | AstNodeVariableDeclaration *var_decl = &source_node->data.variable_declaration; |
| 3339 | | 3339 | |
| ... | @@ -3364,7 +3364,8 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var) { | ... | @@ -3364,7 +3364,8 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var) { |
| 3364 | if (explicit_type && explicit_type->id == ZigTypeIdInvalid) { | 3364 | if (explicit_type && explicit_type->id == ZigTypeIdInvalid) { |
| 3365 | implicit_type = explicit_type; | 3365 | implicit_type = explicit_type; |
| 3366 | } else if (var_decl->expr) { | 3366 | } else if (var_decl->expr) { |
| 3367 | init_value = analyze_const_value(g, tld_var->base.parent_scope, var_decl->expr, explicit_type, var_decl->symbol); | 3367 | init_value = analyze_const_value_allow_lazy(g, tld_var->base.parent_scope, var_decl->expr, explicit_type, |
| | 3368 | var_decl->symbol, allow_lazy); |
| 3368 | assert(init_value); | 3369 | assert(init_value); |
| 3369 | implicit_type = init_value->type; | 3370 | implicit_type = init_value->type; |
| 3370 | | 3371 | |
| ... | @@ -3539,50 +3540,57 @@ static void preview_use_decl(CodeGen *g, TldUsingNamespace *using_namespace, Sco | ... | @@ -3539,50 +3540,57 @@ static void preview_use_decl(CodeGen *g, TldUsingNamespace *using_namespace, Sco |
| 3539 | } | 3540 | } |
| 3540 | } | 3541 | } |
| 3541 | | 3542 | |
| 3542 | void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node) { | 3543 | void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy) { |
| 3543 | if (tld->resolution != TldResolutionUnresolved) | 3544 | bool want_resolve_lazy = tld->resolution == TldResolutionOkLazy && !allow_lazy; |
| | 3545 | if (tld->resolution != TldResolutionUnresolved && !want_resolve_lazy) |
| 3544 | return; | 3546 | return; |
| 3545 | | 3547 | |
| 3546 | assert(tld->resolution != TldResolutionResolving); | | |
| 3547 | tld->resolution = TldResolutionResolving; | 3548 | tld->resolution = TldResolutionResolving; |
| 3548 | | 3549 | |
| 3549 | switch (tld->id) { | 3550 | switch (tld->id) { |
| 3550 | case TldIdVar: | 3551 | case TldIdVar: { |
| 3551 | { | 3552 | TldVar *tld_var = (TldVar *)tld; |
| 3552 | TldVar *tld_var = (TldVar *)tld; | 3553 | if (want_resolve_lazy) { |
| 3553 | resolve_decl_var(g, tld_var); | 3554 | ir_resolve_lazy(g, source_node, tld_var->var->const_value); |
| 3554 | break; | 3555 | } else { |
| 3555 | } | 3556 | resolve_decl_var(g, tld_var, allow_lazy); |
| 3556 | case TldIdFn: | | |
| 3557 | { | | |
| 3558 | TldFn *tld_fn = (TldFn *)tld; | | |
| 3559 | resolve_decl_fn(g, tld_fn); | | |
| 3560 | break; | | |
| 3561 | } | | |
| 3562 | case TldIdContainer: | | |
| 3563 | { | | |
| 3564 | TldContainer *tld_container = (TldContainer *)tld; | | |
| 3565 | resolve_decl_container(g, tld_container); | | |
| 3566 | break; | | |
| 3567 | } | | |
| 3568 | case TldIdCompTime: | | |
| 3569 | { | | |
| 3570 | TldCompTime *tld_comptime = (TldCompTime *)tld; | | |
| 3571 | resolve_decl_comptime(g, tld_comptime); | | |
| 3572 | break; | | |
| 3573 | } | 3557 | } |
| | 3558 | tld->resolution = allow_lazy ? TldResolutionOkLazy : TldResolutionOk; |
| | 3559 | break; |
| | 3560 | } |
| | 3561 | case TldIdFn: { |
| | 3562 | TldFn *tld_fn = (TldFn *)tld; |
| | 3563 | resolve_decl_fn(g, tld_fn); |
| | 3564 | |
| | 3565 | tld->resolution = TldResolutionOk; |
| | 3566 | break; |
| | 3567 | } |
| | 3568 | case TldIdContainer: { |
| | 3569 | TldContainer *tld_container = (TldContainer *)tld; |
| | 3570 | resolve_decl_container(g, tld_container); |
| | 3571 | |
| | 3572 | tld->resolution = TldResolutionOk; |
| | 3573 | break; |
| | 3574 | } |
| | 3575 | case TldIdCompTime: { |
| | 3576 | TldCompTime *tld_comptime = (TldCompTime *)tld; |
| | 3577 | resolve_decl_comptime(g, tld_comptime); |
| | 3578 | |
| | 3579 | tld->resolution = TldResolutionOk; |
| | 3580 | break; |
| | 3581 | } |
| 3574 | case TldIdUsingNamespace: { | 3582 | case TldIdUsingNamespace: { |
| 3575 | TldUsingNamespace *tld_using_namespace = (TldUsingNamespace *)tld; | 3583 | TldUsingNamespace *tld_using_namespace = (TldUsingNamespace *)tld; |
| 3576 | assert(tld_using_namespace->base.parent_scope->id == ScopeIdDecls); | 3584 | assert(tld_using_namespace->base.parent_scope->id == ScopeIdDecls); |
| 3577 | ScopeDecls *dest_decls_scope = (ScopeDecls *)tld_using_namespace->base.parent_scope; | 3585 | ScopeDecls *dest_decls_scope = (ScopeDecls *)tld_using_namespace->base.parent_scope; |
| 3578 | preview_use_decl(g, tld_using_namespace, dest_decls_scope); | 3586 | preview_use_decl(g, tld_using_namespace, dest_decls_scope); |
| 3579 | resolve_use_decl(g, tld_using_namespace, dest_decls_scope); | 3587 | resolve_use_decl(g, tld_using_namespace, dest_decls_scope); |
| | 3588 | |
| | 3589 | tld->resolution = TldResolutionOk; |
| 3580 | break; | 3590 | break; |
| 3581 | } | 3591 | } |
| 3582 | } | 3592 | } |
| 3583 | | 3593 | |
| 3584 | tld->resolution = TldResolutionOk; | | |
| 3585 | | | |
| 3586 | if (g->trace_err != nullptr && source_node != nullptr) { | 3594 | if (g->trace_err != nullptr && source_node != nullptr) { |
| 3587 | g->trace_err = add_error_note(g, g->trace_err, source_node, buf_create_from_str("referenced here")); | 3595 | g->trace_err = add_error_note(g, g->trace_err, source_node, buf_create_from_str("referenced here")); |
| 3588 | } | 3596 | } |
| ... | @@ -4254,7 +4262,7 @@ void semantic_analyze(CodeGen *g) { | ... | @@ -4254,7 +4262,7 @@ void semantic_analyze(CodeGen *g) { |
| 4254 | Tld *tld = g->resolve_queue.at(g->resolve_queue_index); | 4262 | Tld *tld = g->resolve_queue.at(g->resolve_queue_index); |
| 4255 | g->trace_err = nullptr; | 4263 | g->trace_err = nullptr; |
| 4256 | AstNode *source_node = nullptr; | 4264 | AstNode *source_node = nullptr; |
| 4257 | resolve_top_level_decl(g, tld, source_node); | 4265 | resolve_top_level_decl(g, tld, source_node, false); |
| 4258 | } | 4266 | } |
| 4259 | | 4267 | |
| 4260 | for (; g->fn_defs_index < g->fn_defs.length; g->fn_defs_index += 1) { | 4268 | for (; g->fn_defs_index < g->fn_defs.length; g->fn_defs_index += 1) { |
| ... | @@ -6602,7 +6610,7 @@ bool type_ptr_eql(const ZigType *a, const ZigType *b) { | ... | @@ -6602,7 +6610,7 @@ bool type_ptr_eql(const ZigType *a, const ZigType *b) { |
| 6602 | | 6610 | |
| 6603 | ConstExprValue *get_builtin_value(CodeGen *codegen, const char *name) { | 6611 | ConstExprValue *get_builtin_value(CodeGen *codegen, const char *name) { |
| 6604 | Tld *tld = get_container_scope(codegen->compile_var_import)->decl_table.get(buf_create_from_str(name)); | 6612 | Tld *tld = get_container_scope(codegen->compile_var_import)->decl_table.get(buf_create_from_str(name)); |
| 6605 | resolve_top_level_decl(codegen, tld, nullptr); | 6613 | resolve_top_level_decl(codegen, tld, nullptr, false); |
| 6606 | assert(tld->id == TldIdVar); | 6614 | assert(tld->id == TldIdVar); |
| 6607 | TldVar *tld_var = (TldVar *)tld; | 6615 | TldVar *tld_var = (TldVar *)tld; |
| 6608 | ConstExprValue *var_value = tld_var->var->const_value; | 6616 | ConstExprValue *var_value = tld_var->var->const_value; |