Actually assumed-type alone (like C’s (void *) ) is not sufficient. Assumed-shape, assumed-rank, pointer and allocatable all get passed by descriptor that can describe a non-contiguous array section. Declaring the dummy argument CONTIGUOUS will also trigger a copy if the actual is not contiguous. As noted before, this is for “normal” sections, not vector subscripts. All of assumed-shape, assumed-rank, pointer, allocatable, or contiguous arguments require a visible interface.
It is helpful, if known, to declare the dummy as INTENT(IN) or INTENT(OUT). That can eliminate on of the copies if the interface can be determined by the compiler.