| ... | ... | @@ -3091,7 +3091,7 @@ void init_tld(Tld *tld, TldId id, Buf *name, VisibMod visib_mod, AstNode *source |
| 3091 | 3091 | |
| 3092 | 3092 | void update_compile_var(CodeGen *g, Buf *name, ConstExprValue *value) { |
| 3093 | 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 | 3095 | assert(tld->id == TldIdVar); |
| 3096 | 3096 | TldVar *tld_var = (TldVar *)tld; |
| 3097 | 3097 | tld_var->var->const_value = value; |
| ... | ... | @@ -3333,7 +3333,7 @@ ZigVar *add_variable(CodeGen *g, AstNode *source_node, Scope *parent_scope, Buf |
| 3333 | 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 | 3337 | AstNode *source_node = tld_var->base.source_node; |
| 3338 | 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 | 3364 | if (explicit_type && explicit_type->id == ZigTypeIdInvalid) { |
| 3365 | 3365 | implicit_type = explicit_type; |
| 3366 | 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 | 3369 | assert(init_value); |
| 3369 | 3370 | implicit_type = init_value->type; |
| 3370 | 3371 | |
| ... | ... | @@ -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 | | if (tld->resolution != TldResolutionUnresolved) |
| 3543 | void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool allow_lazy) { |
| 3544 | bool want_resolve_lazy = tld->resolution == TldResolutionOkLazy && !allow_lazy; |
| 3545 | if (tld->resolution != TldResolutionUnresolved && !want_resolve_lazy) |
| 3544 | 3546 | return; |
| 3545 | 3547 | |
| 3546 | | assert(tld->resolution != TldResolutionResolving); |
| 3547 | 3548 | tld->resolution = TldResolutionResolving; |
| 3548 | 3549 | |
| 3549 | 3550 | switch (tld->id) { |
| 3550 | | case TldIdVar: |
| 3551 | | { |
| 3552 | | TldVar *tld_var = (TldVar *)tld; |
| 3553 | | resolve_decl_var(g, tld_var); |
| 3554 | | break; |
| 3555 | | } |
| 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; |
| 3551 | case TldIdVar: { |
| 3552 | TldVar *tld_var = (TldVar *)tld; |
| 3553 | if (want_resolve_lazy) { |
| 3554 | ir_resolve_lazy(g, source_node, tld_var->var->const_value); |
| 3555 | } else { |
| 3556 | resolve_decl_var(g, tld_var, allow_lazy); |
| 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 | 3582 | case TldIdUsingNamespace: { |
| 3575 | 3583 | TldUsingNamespace *tld_using_namespace = (TldUsingNamespace *)tld; |
| 3576 | 3584 | assert(tld_using_namespace->base.parent_scope->id == ScopeIdDecls); |
| 3577 | 3585 | ScopeDecls *dest_decls_scope = (ScopeDecls *)tld_using_namespace->base.parent_scope; |
| 3578 | 3586 | preview_use_decl(g, tld_using_namespace, dest_decls_scope); |
| 3579 | 3587 | resolve_use_decl(g, tld_using_namespace, dest_decls_scope); |
| 3588 | |
| 3589 | tld->resolution = TldResolutionOk; |
| 3580 | 3590 | break; |
| 3581 | 3591 | } |
| 3582 | 3592 | } |
| 3583 | 3593 | |
| 3584 | | tld->resolution = TldResolutionOk; |
| 3585 | | |
| 3586 | 3594 | if (g->trace_err != nullptr && source_node != nullptr) { |
| 3587 | 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 | 4262 | Tld *tld = g->resolve_queue.at(g->resolve_queue_index); |
| 4255 | 4263 | g->trace_err = nullptr; |
| 4256 | 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 | 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 | 6610 | |
| 6603 | 6611 | ConstExprValue *get_builtin_value(CodeGen *codegen, const char *name) { |
| 6604 | 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 | 6614 | assert(tld->id == TldIdVar); |
| 6607 | 6615 | TldVar *tld_var = (TldVar *)tld; |
| 6608 | 6616 | ConstExprValue *var_value = tld_var->var->const_value; |