http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60191
--- Comment #9 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- Hmm, I debugged a bit and found this: the problem starts in gfc_get_function_type it is first called on sym->name = "make_real", and then recursively again on the same sym. So this is a recursive_type. The first call returns a build_function_type_vec (with full parameter list) But the recursive call returns a build_varargs_function_type_vec (with a shorter parameter list) The problem is that these declarations are not identical: So in the case of arm with --float-abi=hard this has a somewhat surprising effect: Varargs functions return a float result in r0 Normal functions returns a float result in s0. If there were float arguments they would not be passed on FPU-Registers for varargs functions, but because fortran passes every in-parameter by reference that is not visible. However that may well be different for other targets, for instance, pass the declared parameters in registers, and pass everything after "..." on stack.