The code below is missing a declaration "INTEGER :: I".
subroutine bsub implicit none integer :: ia(2) = [(i+2, i=2,3)] print *,(i,ia(i),i=1,2) end subroutine
Therefore, error messages and aborting of the compilation are expected. The 18.0.5 and 19.0.1 compilers say:
bsub.f90(3): error #6404: This name does not have a type, and must have an explicit type. integer :: ia(2) = [(i+2, i=2,3)] --------------------------^ bsub.f90(5): error #6404: This name does not have a type, and must have an explicit type. print *,(i,ia(i),i=1,2) ---------^ bsub.f90(5): error #6063: An INTEGER or REAL data type is required in this context. print *,(i,ia(i),i=1,2) -----------------^ bsub.f90(5): error #8251: An input item must not appear as the implied-DO variable of any implied-DO loop that contains the input item. print *,(i,ia(i),i=1,2) ---------^ compilation aborted for bsub.f90 (code 1)
The last error message would have been appropriate if the code had contained a READ statement with the same implied DO list as the PRINT statement.
Does the Fortran standard require the indexing variable of an implied DO loop to the declared (at all, much less than explicitly as integer)?
If IMPLICIT NONE is in effect, yes it does, the same as any other variable. Here is what the standard says for the implied DO in an array constructor:
The name of a data-i-do-variable in a DATA statement or an ac-do-variable in an array constructor has a scope of its data-implied-do or ac-implied-do. It is a scalar variable. If integer-type-spec appears in data-implied-do or ac-implied-do-control it has the specified type and type parameters; otherwise it has the type and type parameters that it would have if it were the name of a variable in the innermost executable construct or scoping unit that includes the DATA statement or array constructor, and this type shall be integer type. It has no other attributes. The appearance of a name as a data-i-do-variable of an implied DO in a DATA statement or an ac-do-variable in an array constructor is not an implicit declaration of a variable whose scope is the scoping unit that contains the statement.
The implied DO in the I/O statement is different in that it IS a variable in the enclosing scope, but you are still required to declare it if it wouldn't otherwise have an implicit integer type.