| ... | ... | @@ -15799,26 +15799,60 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c |
| 15799 | 15799 | casted_args[next_arg_index] = casted_arg; |
| 15800 | 15800 | next_arg_index += 1; |
| 15801 | 15801 | } |
| 15802 | | size_t iter_count = (call_param_count < call_instruction->arg_count) ? |
| 15803 | | call_param_count : call_instruction->arg_count; |
| 15804 | | for (size_t call_i = 0; call_i < iter_count; call_i += 1) { |
| 15802 | for (size_t call_i = 0; call_i < call_instruction->arg_count; call_i += 1) { |
| 15805 | 15803 | IrInstruction *old_arg = call_instruction->args[call_i]->child; |
| 15806 | 15804 | if (type_is_invalid(old_arg->value.type)) |
| 15807 | 15805 | return ira->codegen->invalid_instruction; |
| 15808 | | IrInstruction *casted_arg; |
| 15809 | | if (next_arg_index < src_param_count) { |
| 15810 | | ZigType *param_type = fn_type_id->param_info[next_arg_index].type; |
| 15811 | | if (type_is_invalid(param_type)) |
| 15812 | | return ira->codegen->invalid_instruction; |
| 15813 | | casted_arg = ir_implicit_cast(ira, old_arg, param_type); |
| 15814 | | if (type_is_invalid(casted_arg->value.type)) |
| 15815 | | return ira->codegen->invalid_instruction; |
| 15806 | |
| 15807 | if (old_arg->value.type->id == ZigTypeIdArgTuple) { |
| 15808 | for (size_t arg_tuple_i = old_arg->value.data.x_arg_tuple.start_index; |
| 15809 | arg_tuple_i < old_arg->value.data.x_arg_tuple.end_index; arg_tuple_i += 1) |
| 15810 | { |
| 15811 | ZigVar *arg_var = get_fn_var_by_index(parent_fn_entry, arg_tuple_i); |
| 15812 | if (arg_var == nullptr) { |
| 15813 | ir_add_error(ira, old_arg, |
| 15814 | buf_sprintf("compiler bug: var args can't handle void. https://github.com/ziglang/zig/issues/557")); |
| 15815 | return ira->codegen->invalid_instruction; |
| 15816 | } |
| 15817 | IrInstruction *arg_var_ptr_inst = ir_get_var_ptr(ira, old_arg, arg_var); |
| 15818 | if (type_is_invalid(arg_var_ptr_inst->value.type)) |
| 15819 | return ira->codegen->invalid_instruction; |
| 15820 | |
| 15821 | IrInstruction *arg_tuple_arg = ir_get_deref(ira, old_arg, arg_var_ptr_inst, nullptr); |
| 15822 | if (type_is_invalid(arg_tuple_arg->value.type)) |
| 15823 | return ira->codegen->invalid_instruction; |
| 15824 | |
| 15825 | IrInstruction *casted_arg; |
| 15826 | if (next_arg_index < src_param_count) { |
| 15827 | ZigType *param_type = fn_type_id->param_info[next_arg_index].type; |
| 15828 | if (type_is_invalid(param_type)) |
| 15829 | return ira->codegen->invalid_instruction; |
| 15830 | casted_arg = ir_implicit_cast(ira, arg_tuple_arg, param_type); |
| 15831 | if (type_is_invalid(casted_arg->value.type)) |
| 15832 | return ira->codegen->invalid_instruction; |
| 15833 | } else { |
| 15834 | casted_arg = arg_tuple_arg; |
| 15835 | } |
| 15836 | |
| 15837 | casted_args[next_arg_index] = casted_arg; |
| 15838 | next_arg_index += 1; |
| 15839 | } |
| 15816 | 15840 | } else { |
| 15817 | | casted_arg = old_arg; |
| 15818 | | } |
| 15841 | IrInstruction *casted_arg; |
| 15842 | if (next_arg_index < src_param_count) { |
| 15843 | ZigType *param_type = fn_type_id->param_info[next_arg_index].type; |
| 15844 | if (type_is_invalid(param_type)) |
| 15845 | return ira->codegen->invalid_instruction; |
| 15846 | casted_arg = ir_implicit_cast(ira, old_arg, param_type); |
| 15847 | if (type_is_invalid(casted_arg->value.type)) |
| 15848 | return ira->codegen->invalid_instruction; |
| 15849 | } else { |
| 15850 | casted_arg = old_arg; |
| 15851 | } |
| 15819 | 15852 | |
| 15820 | | casted_args[next_arg_index] = casted_arg; |
| 15821 | | next_arg_index += 1; |
| 15853 | casted_args[next_arg_index] = casted_arg; |
| 15854 | next_arg_index += 1; |
| 15855 | } |
| 15822 | 15856 | } |
| 15823 | 15857 | |
| 15824 | 15858 | assert(next_arg_index == call_param_count); |