@@ -928,13 +928,13 @@ static IrInstruction *ir_build_union_field_ptr_from(IrBuilder *irb, IrInstructio
928928
929929static IrInstruction *ir_build_call(IrBuilder *irb, Scope *scope, AstNode *source_node,
930930 FnTableEntry *fn_entry, IrInstruction *fn_ref, size_t arg_count, IrInstruction **args,
931- bool is_comptime, bool is_inline )
931+ bool is_comptime, FnInline fn_inline )
932932{
933933 IrInstructionCall *call_instruction = ir_build_instruction<IrInstructionCall>(irb, scope, source_node);
934934 call_instruction->fn_entry = fn_entry;
935935 call_instruction->fn_ref = fn_ref;
936936 call_instruction->is_comptime = is_comptime;
937- call_instruction->is_inline = is_inline ;
937+ call_instruction->fn_inline = fn_inline ;
938938 call_instruction->args = args;
939939 call_instruction->arg_count = arg_count;
940940
@@ -948,10 +948,10 @@ static IrInstruction *ir_build_call(IrBuilder *irb, Scope *scope, AstNode *sourc
948948
949949static IrInstruction *ir_build_call_from(IrBuilder *irb, IrInstruction *old_instruction,
950950 FnTableEntry *fn_entry, IrInstruction *fn_ref, size_t arg_count, IrInstruction **args,
951- bool is_comptime, bool is_inline )
951+ bool is_comptime, FnInline fn_inline )
952952{
953953 IrInstruction *new_instruction = ir_build_call(irb, old_instruction->scope,
954- old_instruction->source_node, fn_entry, fn_ref, arg_count, args, is_comptime, is_inline );
954+ old_instruction->source_node, fn_entry, fn_ref, arg_count, args, is_comptime, fn_inline );
955955 ir_link_new_instruction(new_instruction, old_instruction);
956956 return new_instruction;
957957}
@@ -4672,6 +4672,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46724672 return ir_build_offset_of(irb, scope, node, arg0_value, arg1_value);
46734673 }
46744674 case BuiltinFnIdInlineCall:
4675+ case BuiltinFnIdNoInlineCall:
46754676 {
46764677 if (node->data.fn_call_expr.params.length == 0) {
46774678 add_node_error(irb->codegen, node, buf_sprintf("expected at least 1 argument, found 0"));
@@ -4692,8 +4693,9 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46924693 if (args[i] == irb->codegen->invalid_instruction)
46934694 return args[i];
46944695 }
4696+ FnInline fn_inline = (builtin_fn->id == BuiltinFnIdInlineCall) ? FnInlineAlways : FnInlineNever;
46954697
4696- return ir_build_call(irb, scope, node, nullptr, fn_ref, arg_count, args, false, true );
4698+ return ir_build_call(irb, scope, node, nullptr, fn_ref, arg_count, args, false, fn_inline );
46974699 }
46984700 case BuiltinFnIdTypeId:
46994701 {
@@ -4804,7 +4806,7 @@ static IrInstruction *ir_gen_fn_call(IrBuilder *irb, Scope *scope, AstNode *node
48044806 return args[i];
48054807 }
48064808
4807- return ir_build_call(irb, scope, node, nullptr, fn_ref, arg_count, args, false, false );
4809+ return ir_build_call(irb, scope, node, nullptr, fn_ref, arg_count, args, false, FnInlineAuto );
48084810}
48094811
48104812static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode *node) {
@@ -10617,7 +10619,7 @@ static IrInstruction *ir_get_var_ptr(IrAnalyze *ira, IrInstruction *instruction,
1061710619
1061810620static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *call_instruction,
1061910621 FnTableEntry *fn_entry, TypeTableEntry *fn_type, IrInstruction *fn_ref,
10620- IrInstruction *first_arg_ptr, bool comptime_fn_call, bool inline_fn_call )
10622+ IrInstruction *first_arg_ptr, bool comptime_fn_call, FnInline fn_inline )
1062110623{
1062210624 FnTypeId *fn_type_id = &fn_type->data.fn.fn_type_id;
1062310625 size_t first_arg_1_or_0 = first_arg_ptr ? 1 : 0;
@@ -10876,7 +10878,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
1087610878
1087710879 if (type_requires_comptime(return_type)) {
1087810880 // Throw out our work and call the function as if it were comptime.
10879- return ir_analyze_fn_call(ira, call_instruction, fn_entry, fn_type, fn_ref, first_arg_ptr, true, false );
10881+ return ir_analyze_fn_call(ira, call_instruction, fn_entry, fn_type, fn_ref, first_arg_ptr, true, FnInlineAuto );
1088010882 }
1088110883 }
1088210884
@@ -10900,7 +10902,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
1090010902
1090110903 size_t impl_param_count = impl_fn->type_entry->data.fn.fn_type_id.param_count;
1090210904 IrInstruction *new_call_instruction = ir_build_call_from(&ira->new_irb, &call_instruction->base,
10903- impl_fn, nullptr, impl_param_count, casted_args, false, inline_fn_call );
10905+ impl_fn, nullptr, impl_param_count, casted_args, false, fn_inline );
1090410906
1090510907 TypeTableEntry *return_type = impl_fn->type_entry->data.fn.fn_type_id.return_type;
1090610908 ir_add_alloca(ira, new_call_instruction, return_type);
@@ -10959,7 +10961,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
1095910961 return ira->codegen->builtin_types.entry_invalid;
1096010962
1096110963 IrInstruction *new_call_instruction = ir_build_call_from(&ira->new_irb, &call_instruction->base,
10962- fn_entry, fn_ref, call_param_count, casted_args, false, inline_fn_call );
10964+ fn_entry, fn_ref, call_param_count, casted_args, false, fn_inline );
1096310965
1096410966 ir_add_alloca(ira, new_call_instruction, return_type);
1096510967 return ir_finish_anal(ira, return_type);
@@ -10998,13 +11000,13 @@ static TypeTableEntry *ir_analyze_instruction_call(IrAnalyze *ira, IrInstruction
1099811000 } else if (fn_ref->value.type->id == TypeTableEntryIdFn) {
1099911001 FnTableEntry *fn_table_entry = ir_resolve_fn(ira, fn_ref);
1100011002 return ir_analyze_fn_call(ira, call_instruction, fn_table_entry, fn_table_entry->type_entry,
11001- fn_ref, nullptr, is_comptime, call_instruction->is_inline );
11003+ fn_ref, nullptr, is_comptime, call_instruction->fn_inline );
1100211004 } else if (fn_ref->value.type->id == TypeTableEntryIdBoundFn) {
1100311005 assert(fn_ref->value.special == ConstValSpecialStatic);
1100411006 FnTableEntry *fn_table_entry = fn_ref->value.data.x_bound_fn.fn;
1100511007 IrInstruction *first_arg_ptr = fn_ref->value.data.x_bound_fn.first_arg;
1100611008 return ir_analyze_fn_call(ira, call_instruction, fn_table_entry, fn_table_entry->type_entry,
11007- nullptr, first_arg_ptr, is_comptime, call_instruction->is_inline );
11009+ nullptr, first_arg_ptr, is_comptime, call_instruction->fn_inline );
1100811010 } else {
1100911011 ir_add_error_node(ira, fn_ref->source_node,
1101011012 buf_sprintf("type '%s' not a function", buf_ptr(&fn_ref->value.type->name)));
@@ -11014,7 +11016,7 @@ static TypeTableEntry *ir_analyze_instruction_call(IrAnalyze *ira, IrInstruction
1101411016
1101511017 if (fn_ref->value.type->id == TypeTableEntryIdFn) {
1101611018 return ir_analyze_fn_call(ira, call_instruction, nullptr, fn_ref->value.type,
11017- fn_ref, nullptr, false, false );
11019+ fn_ref, nullptr, false, FnInlineAuto );
1101811020 } else {
1101911021 ir_add_error_node(ira, fn_ref->source_node,
1102011022 buf_sprintf("type '%s' not a function", buf_ptr(&fn_ref->value.type->name)));
0 commit comments