A procedure must have an explicit interface in the following cases:
If the procedure has any of the following:
A dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE, or VOLATILE attribute
A dummy argument that is an assumed-shape array
A result that is an array, or a pointer, or is allocatable (functions only)
A result whose length is neither assumed nor a constant (character functions only)
If a reference to the procedure appears as follows:
With an argument keyword
As a reference by its generic name
As a defined assignment (subroutines only)
In an expression as a defined operator (functions only)
In a context that requires it to be pure
If the procedure is elemental