! RUN: %S/test_errors.sh %s %t %f18 -Mstandard -Werror ! Issue 458 -- semantic checks for a normal DO loop. The DO variable ! and the initial, final, and step expressions must be INTEGER if the ! options for standard conformance and turning warnings into errors ! are both in effect. This test turns on the options for standards ! conformance and turning warnings into errors. This produces error ! messages for the cases where REAL and DOUBLE PRECISION variables ! and expressions are used in the DO controls. ! C1120 -- DO variable (and associated expressions) must be INTEGER. ! This is extended by allowing REAL and DOUBLE PRECISION MODULE share INTEGER :: intvarshare REAL :: realvarshare DOUBLE PRECISION :: dpvarshare END MODULE share PROGRAM do_issue_458 USE share IMPLICIT NONE INTEGER :: ivar REAL :: rvar DOUBLE PRECISION :: dvar LOGICAL :: lvar COMPLEX :: cvar CHARACTER :: chvar INTEGER, DIMENSION(3) :: avar TYPE derived REAL :: first INTEGER :: second END TYPE derived TYPE(derived) :: devar INTEGER, POINTER :: pivar REAL, POINTER :: prvar DOUBLE PRECISION, POINTER :: pdvar LOGICAL, POINTER :: plvar INTERFACE SUBROUTINE sub() END SUBROUTINE sub FUNCTION ifunc() END FUNCTION ifunc END INTERFACE PROCEDURE(ifunc), POINTER :: pifunc => NULL() ! DO variables ! INTEGER DO variable DO ivar = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! REAL DO variable DO rvar = 1, 10, 3 PRINT *, "rvar is: ", rvar END DO ! DOUBLE PRECISISON DO variable DO dvar = 1, 10, 3 PRINT *, "dvar is: ", dvar END DO ! Pointer to INTEGER DO variable ALLOCATE(pivar) DO pivar = 1, 10, 3 PRINT *, "pivar is: ", pivar END DO ! Pointer to REAL DO variable ALLOCATE(prvar) DO prvar = 1, 10, 3 PRINT *, "prvar is: ", prvar END DO ! Pointer to DOUBLE PRECISION DO variable ALLOCATE(pdvar) DO pdvar = 1, 10, 3 PRINT *, "pdvar is: ", pdvar END DO ! CHARACTER DO variable !ERROR: DO controls should be INTEGER DO chvar = 1, 10, 3 PRINT *, "chvar is: ", chvar END DO ! LOGICAL DO variable !ERROR: DO controls should be INTEGER DO lvar = 1, 10, 3 PRINT *, "lvar is: ", lvar END DO ! COMPLEX DO variable !ERROR: DO controls should be INTEGER DO cvar = 1, 10, 3 PRINT *, "cvar is: ", cvar END DO ! Derived type DO variable !ERROR: DO controls should be INTEGER DO devar = 1, 10, 3 PRINT *, "devar is: ", devar END DO ! Pointer to LOGICAL DO variable ALLOCATE(plvar) !ERROR: DO controls should be INTEGER DO plvar = 1, 10, 3 PRINT *, "plvar is: ", plvar END DO ! SUBROUTINE DO variable !ERROR: DO control must be an INTEGER variable DO sub = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! FUNCTION DO variable !ERROR: DO control must be an INTEGER variable DO ifunc = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! POINTER to FUNCTION DO variable !ERROR: DO control must be an INTEGER variable DO pifunc = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Array DO variable !ERROR: Must be a scalar value, but is a rank-1 array DO avar = 1, 10, 3 PRINT *, "plvar is: ", plvar END DO ! Undeclared DO variable !ERROR: No explicit type declared for 'undeclared' DO undeclared = 1, 10, 3 PRINT *, "plvar is: ", plvar END DO ! Shared association INTEGER DO variable DO intvarshare = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Shared association REAL DO variable DO realvarshare = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Shared association DOUBLE PRECISION DO variable DO dpvarshare = 1, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Initial expressions ! REAL initial expression DO ivar = rvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! DOUBLE PRECISION initial expression DO ivar = dvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to INTEGER initial expression DO ivar = pivar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to REAL initial expression DO ivar = prvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to DOUBLE PRECISION initial expression DO ivar = pdvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! LOGICAL initial expression !ERROR: DO controls should be INTEGER DO ivar = lvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! COMPLEX initial expression !ERROR: DO controls should be INTEGER DO ivar = cvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Derived type initial expression !ERROR: DO controls should be INTEGER DO ivar = devar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to LOGICAL initial expression !ERROR: DO controls should be INTEGER DO ivar = plvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Invalid initial expression !ERROR: Integer literal is too large for INTEGER(KIND=4) DO ivar = -2147483648_4, 10, 3 PRINT *, "ivar is: ", ivar END DO ! Final expression ! REAL final expression DO ivar = 1, rvar, 3 PRINT *, "ivar is: ", ivar END DO ! DOUBLE PRECISION final expression DO ivar = 1, dvar, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to INTEGER final expression DO ivar = 1, pivar, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to REAL final expression DO ivar = 1, prvar, 3 PRINT *, "ivar is: ", ivar END DO ! Pointer to DOUBLE PRECISION final expression DO ivar = pdvar, 10, 3 PRINT *, "ivar is: ", ivar END DO ! COMPLEX final expression !ERROR: DO controls should be INTEGER DO ivar = 1, cvar, 3 PRINT *, "ivar is: ", ivar END DO ! Invalid final expression !ERROR: Integer literal is too large for INTEGER(KIND=4) DO ivar = 1, -2147483648_4, 3 PRINT *, "ivar is: ", ivar END DO ! Step expression ! REAL step expression DO ivar = 1, 10, rvar PRINT *, "ivar is: ", ivar END DO ! DOUBLE PRECISION step expression DO ivar = 1, 10, dvar PRINT *, "ivar is: ", ivar END DO ! Pointer to INTEGER step expression DO ivar = 1, 10, pivar PRINT *, "ivar is: ", ivar END DO ! Pointer to REAL step expression DO ivar = 1, 10, prvar PRINT *, "ivar is: ", ivar END DO ! Pointer to DOUBLE PRECISION step expression DO ivar = 1, 10, pdvar PRINT *, "ivar is: ", ivar END DO ! COMPLEX Step expression !ERROR: DO controls should be INTEGER DO ivar = 1, 10, cvar PRINT *, "ivar is: ", ivar END DO ! Invalid step expression !ERROR: Integer literal is too large for INTEGER(KIND=4) DO ivar = 1, 10, -2147483648_4 PRINT *, "ivar is: ", ivar END DO END PROGRAM do_issue_458