Intel® Fortran Compiler 18.0 Developer Guide and Reference
An assumed-rank array is declared with array bounds.
You declare an assumed-rank object (a dummy variable) by using DIMENSION(..) or (..)array bounds in its declaration.
Its rank is assumed from its effective argument, which means it is passed by descriptor.
An assumed-rank entity must not have the CODIMENSION or VALUE attribute. It can have the CONTIGUOUS attribute.
An assumed-rank variable name must not appear in a designator or expression except as one of the following:
An actual argument corresponding to a dummy argument that is assumed-rank
The argument of the C_LOC function in the ISO_C_BINDING intrinsic module
The first argument in a reference to an intrinsic inquiry function
If an assumed-size or nonallocatable, nonpointer, assumed-rank array is an actual argument corresponding to a dummy argument that is an INTENT(OUT) assumed-rank array, it must not be polymorphic, finalizable, of a type with an allocatable ultimate component, or of a type for which default initialization is specified.
You can find the rank of an assumed-rank object by using the RANK intrinsic.
If a procedure has an assumed-rank argument, the procedure must have an explicit interface.
When an assumed-rank object is passed from Fortran to a BIND(C) routine, it is passed by C descriptor. A Fortran procedure that has the BIND(C) language-binding-spec attribute will also receive an assumed-rank object by C descriptor.
The following shows an assumed-rank object:
SUBROUTINE sub (foo, bar)
! As sub does not have BIND, foo and bar are passed by "normal" descriptor
REAL, DIMENSION(..) :: foo
INTEGER :: bar(..)
INTERFACE
SUBROUTINE csub (baz) BIND(C)
REAL, DIMENSION(..) :: baz
END SUBROUTINE
END INTERFACE
CALL baz(foo) ! Passed by C descriptor