| ... | @@ -17675,18 +17675,36 @@ static IrInstruction *ir_analyze_container_member_access_inner(IrAnalyze *ira, | ... | @@ -17675,18 +17675,36 @@ static IrInstruction *ir_analyze_container_member_access_inner(IrAnalyze *ira, |
| 17675 | assert(container_scope != nullptr); | 17675 | assert(container_scope != nullptr); |
| 17676 | auto entry = container_scope->decl_table.maybe_get(field_name); | 17676 | auto entry = container_scope->decl_table.maybe_get(field_name); |
| 17677 | Tld *tld = entry ? entry->value : nullptr; | 17677 | Tld *tld = entry ? entry->value : nullptr; |
| 17678 | if (tld && tld->id == TldIdFn) { | 17678 | if (tld) { |
| 17679 | resolve_top_level_decl(ira->codegen, tld, source_instr->source_node, false); | 17679 | if (tld->id == TldIdFn) { |
| 17680 | if (tld->resolution == TldResolutionInvalid) | 17680 | resolve_top_level_decl(ira->codegen, tld, source_instr->source_node, false); |
| 17681 | return ira->codegen->invalid_instruction; | 17681 | if (tld->resolution == TldResolutionInvalid) |
| 17682 | TldFn *tld_fn = (TldFn *)tld; | 17682 | return ira->codegen->invalid_instruction; |
| 17683 | ZigFn *fn_entry = tld_fn->fn_entry; | 17683 | TldFn *tld_fn = (TldFn *)tld; |
| 17684 | if (type_is_invalid(fn_entry->type_entry)) | 17684 | ZigFn *fn_entry = tld_fn->fn_entry; |
| 17685 | return ira->codegen->invalid_instruction; | 17685 | if (type_is_invalid(fn_entry->type_entry)) |
| | 17686 | return ira->codegen->invalid_instruction; |
| | 17687 | |
| | 17688 | IrInstruction *bound_fn_value = ir_build_const_bound_fn(&ira->new_irb, source_instr->scope, |
| | 17689 | source_instr->source_node, fn_entry, container_ptr); |
| | 17690 | return ir_get_ref(ira, source_instr, bound_fn_value, true, false); |
| | 17691 | } else if (tld->id == TldIdVar) { |
| | 17692 | resolve_top_level_decl(ira->codegen, tld, source_instr->source_node, false); |
| | 17693 | if (tld->resolution == TldResolutionInvalid) |
| | 17694 | return ira->codegen->invalid_instruction; |
| | 17695 | TldVar *tld_var = (TldVar *)tld; |
| | 17696 | ZigVar *var = tld_var->var; |
| | 17697 | if (type_is_invalid(var->var_type)) |
| | 17698 | return ira->codegen->invalid_instruction; |
| 17686 | | 17699 | |
| 17687 | IrInstruction *bound_fn_value = ir_build_const_bound_fn(&ira->new_irb, source_instr->scope, | 17700 | if (var->const_value->type->id == ZigTypeIdFn) { |
| 17688 | source_instr->source_node, fn_entry, container_ptr); | 17701 | ir_assert(var->const_value->data.x_ptr.special == ConstPtrSpecialFunction, source_instr); |
| 17689 | return ir_get_ref(ira, source_instr, bound_fn_value, true, false); | 17702 | ZigFn *fn = var->const_value->data.x_ptr.data.fn.fn_entry; |
| | 17703 | IrInstruction *bound_fn_value = ir_build_const_bound_fn(&ira->new_irb, source_instr->scope, |
| | 17704 | source_instr->source_node, fn, container_ptr); |
| | 17705 | return ir_get_ref(ira, source_instr, bound_fn_value, true, false); |
| | 17706 | } |
| | 17707 | } |
| 17690 | } | 17708 | } |
| 17691 | } | 17709 | } |
| 17692 | const char *prefix_name; | 17710 | const char *prefix_name; |