fn C.func(arg int) int

fn fn_variadic(arg int, args ...string) {
	println('Do nothing')
}

fn fn_with_assign_stmts() {
	_, _ := fn_with_multi_return()
}

fn fn_with_multi_return() (int, string) {
	return 0, 'test'
}

fn voidfn() {
	println('this is a function that does not return anything')
}

fn fn_with_1_arg(arg int) int {
	return 0
}

fn fn_with_2a_args(arg1 int, arg2 int) int {
	return 0
}

fn fn_with_2_args_to_be_shorten(arg1 int, arg2 int) int {
	return 0
}

fn fn_with_2b_args(arg1 string, arg2 int) int {
	return 0
}

fn fn_with_3_args(arg1 string, arg2 int, arg3 User) int {
	return 0
}

fn (this User) fn_with_receiver() {
	println('')
}

fn fn_with_optional() ?int {
	if true {
		return error('true')
	}
	return 30
}

fn (f Foo) fn_with_optional() ?int {
	if true {
		return error('true')
	}
	return 40
}

fn mut_array(mut a []int) {
	println(1)
}

fn fn_with_ref_return() &Foo {
	return &Foo{}
}

[inline]
fn fn_with_flag() {
	println('flag')
}
