Allocatable array as function dummy argument

There is no restriction on that. Arguments to a function are not required to be intent(in), as you might think. It is merely a choice. I have seen libraries that use the return value of the function to pass on status (error) information and happily change any or all the arguments that are passed. Whether that is good practice, is another matter. I can imagine good arguments against doing so, but also arguments for it.