type_t *make_function_2_type(type_t *return_type, type_t *argument_type1, type_t *argument_type2, decl_modifiers_t modifiers) { function_parameter_t *const parameter2 = allocate_parameter(argument_type2); function_parameter_t *const parameter1 = allocate_parameter(argument_type1); parameter1->next = parameter2; type_t *type = allocate_type_zero(TYPE_FUNCTION); type->function.return_type = return_type; type->function.parameters = parameter1; type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; return identify_new_type(type); }
type_t *make_function_1_type_variadic(type_t *return_type, type_t *argument_type, decl_modifiers_t modifiers) { function_parameter_t *const parameter = allocate_parameter(argument_type); type_t *type = allocate_type_zero(TYPE_FUNCTION); type->function.return_type = return_type; type->function.parameters = parameter; type->function.variadic = true; type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; return identify_new_type(type); }
type_t *make_function_type(type_t *return_type, int n_types, type_t *const *argument_types, decl_modifiers_t modifiers) { type_t *type = allocate_type_zero(TYPE_FUNCTION); type->function.return_type = return_type; type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; function_parameter_t **anchor = &type->function.parameters; for (int i = 0; i < n_types; ++i) { function_parameter_t *parameter = allocate_parameter(argument_types[i]); *anchor = parameter; anchor = ¶meter->next; } return identify_new_type(type); }