! RUN: %S/test_errors.sh %s %t %f18 ! Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. ! ! Licensed under the Apache License, Version 2.0 (the "License"); ! you may not use this file except in compliance with the License. ! You may obtain a copy of the License at ! ! http://www.apache.org/licenses/LICENSE-2.0 ! ! Unless required by applicable law or agreed to in writing, software ! distributed under the License is distributed on an "AS IS" BASIS, ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ! See the License for the specific language governing permissions and ! limitations under the License. ! !Section 11.1.7.4.3, paragraph 2 states: ! Except for the incrementation of the DO variable that occurs in step (3), ! the DO variable shall neither be redefined nor become undefined while the ! DO construct is active. subroutine s1() ! Redefinition via intrinsic assignment (section 19.6.5, case (1)) do ivar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' ivar = 99 end do ! Redefinition in the presence of a construct association associate (avar => ivar) do ivar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' avar = 99 end do end associate ivar = 99 ! Redefinition via intrinsic assignment (section 19.6.5, case (1)) do concurrent (ivar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' ivar = 99 end do ivar = 99 end subroutine s1 subroutine s2() integer :: ivar read '(I10)', ivar ! Redefinition via an input statement (section 19.6.5, case (3)) do ivar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' read '(I10)', ivar end do ! Redefinition via an input statement (section 19.6.5, case (3)) do concurrent (ivar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' read '(I10)', ivar end do end subroutine s2 subroutine s3() integer :: ivar ! Redefinition via use as a DO variable (section 19.6.5, case (4)) do ivar = 1,10 !ERROR: Cannot redefine DO variable 'ivar' do ivar = 1,20 !ERROR: Cannot redefine DO variable 'ivar' do ivar = 1,30 print *, "hello" end do end do end do ! This one's OK, even though we used ivar previously as a DO variable ! since it's not a redefinition do ivar = 1,40 print *, "hello" end do ! Redefinition via use as a DO variable (section 19.6.5, case (4)) do concurrent (ivar = 1:10) !ERROR: Cannot redefine DO variable 'ivar' do ivar = 1,20 print *, "hello" end do end do end subroutine s3 subroutine s4() integer :: ivar real :: x(10) print '(f10.5)', (x(ivar), ivar = 1, 10) ! Redefinition via use as a DO variable (section 19.6.5, case (5)) do ivar = 1,20 !ERROR: Cannot redefine DO variable 'ivar' print '(f10.5)', (x(ivar), ivar = 1, 10) end do ! Redefinition via use as a DO variable (section 19.6.5, case (5)) do concurrent (ivar = 1:10) !ERROR: Cannot redefine DO variable 'ivar' print '(f10.5)', (x(ivar), ivar = 1, 10) end do end subroutine s4 subroutine s5() integer :: ivar real :: x read (3, '(f10.5)', iostat = ivar) x ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (7)) do ivar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' read (3, '(f10.5)', iostat = ivar) x end do ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (7)) do concurrent (ivar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' read (3, '(f10.5)', iostat = ivar) x end do end subroutine s5 subroutine s6() character (len=3) :: key integer :: chars integer :: ivar real :: x read (3, '(a3)', advance='no', size = chars) key ! Redefinition via use in SIZE specifier (section 19.6.5, case (9)) do ivar = 1,20 !ERROR: Cannot redefine DO variable 'ivar' read (3, '(a3)', advance='no', size = ivar) key print *, "hello" end do ! Redefinition via use in SIZE specifier (section 19.6.5, case (9)) do concurrent (ivar = 1:10) !ERROR: ADVANCE specifier is not allowed in DO CONCURRENT !ERROR: Cannot redefine DO variable 'ivar' read (3, '(a3)', advance='no', size = ivar) key print *, "hello" end do end subroutine s6 subroutine s7() integer :: iostatVar, nextrecVar, numberVar, posVar, reclVar, sizeVar inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (10)) do iostatVar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'iostatvar' inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (10)) do concurrent (iostatVar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'iostatvar' inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in NEXTREC specifier (section 19.6.5, case (10)) do nextrecVar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'nextrecvar' inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in NEXTREC specifier (section 19.6.5, case (10)) do concurrent (nextrecVar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'nextrecvar' inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in NUMBER specifier (section 19.6.5, case (10)) do numberVar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'numbervar' inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in NUMBER specifier (section 19.6.5, case (10)) do concurrent (numberVar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'numbervar' inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in RECL specifier (section 19.6.5, case (10)) do reclVar = 1,20 print *, "hello" inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & !ERROR: Cannot redefine DO variable 'reclvar' pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in RECL specifier (section 19.6.5, case (10)) do concurrent (reclVar = 1:10) print *, "hello" inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & !ERROR: Cannot redefine DO variable 'reclvar' pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in POS specifier (section 19.6.5, case (10)) do posVar = 1,20 print *, "hello" inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & !ERROR: Cannot redefine DO variable 'posvar' pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in POS specifier (section 19.6.5, case (10)) do concurrent (posVar = 1:10) print *, "hello" inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & !ERROR: Cannot redefine DO variable 'posvar' pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in SIZE specifier (section 19.6.5, case (10)) do sizeVar = 1,20 print *, "hello" inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & !ERROR: Cannot redefine DO variable 'sizevar' pos=posVar, recl=reclVar, size=sizeVar) end do ! Redefinition via use in SIZE specifier (section 19.6.5, case (10)) do concurrent (sizeVar = 1:10) print *, "hello" inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, & !ERROR: Cannot redefine DO variable 'sizevar' pos=posVar, recl=reclVar, size=sizeVar) end do end subroutine s7 subroutine s8() Integer :: ivar integer, pointer :: ip allocate(ip, stat = ivar) ! Redefinition via a STAT= specifier (section 19.6.5, case (16)) do ivar = 1,20 !ERROR: Cannot redefine DO variable 'ivar' allocate(ip, stat = ivar) print *, "hello" end do ! Redefinition via a STAT= specifier (section 19.6.5, case (16)) do concurrent (ivar = 1:10) !ERROR: Cannot redefine DO variable 'ivar' allocate(ip, stat = ivar) print *, "hello" end do end subroutine s8 subroutine s9() Integer :: ivar ! OK since the DO CONCURRENT index-name exists only in the scope of the ! DO CONCURRENT construct do ivar = 1,20 print *, "hello" do concurrent (ivar = 1:10) print *, "hello" end do end do ! OK since the DO CONCURRENT index-name exists only in the scope of the ! DO CONCURRENT construct do concurrent (ivar = 1:10) print *, "hello" do concurrent (ivar = 1:10) print *, "hello" end do end do end subroutine s9 subroutine s10() Integer :: ivar open(file="abc", newunit=ivar) ! Redefinition via NEWUNIT specifier (section 19.6.5, case (29)) do ivar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' open(file="abc", newunit=ivar) end do ! Redefinition via NEWUNIT specifier (section 19.6.5, case (29)) do concurrent (ivar = 1:10) print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' open(file="abc", newunit=ivar) end do end subroutine s10 subroutine s11() Integer, allocatable :: ivar allocate(ivar) ! This look is OK do ivar = 1,20 print *, "hello" end do ! Redefinition via deallocation (section 19.6.6, case (10)) do ivar = 1,20 print *, "hello" !ERROR: Cannot redefine DO variable 'ivar' deallocate(ivar) end do ! This case is not applicable since the version of "ivar" that's inside the ! DO CONCURRENT has the scope of the DO CONCURRENT construct. Within that ! scope, it does not have the "allocatable" attribute, so the following test ! fails because you can only deallocate a variable that's allocatable. do concurrent (ivar = 1:10) print *, "hello" !ERROR: name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute deallocate(ivar) end do end subroutine s11 subroutine s12() Integer :: ivar, jvar call intentInSub(jvar, ivar) do ivar = 1,10 call intentInSub(jvar, ivar) end do call intentOutSub(jvar, ivar) do ivar = 1,10 !ERROR: Cannot redefine DO variable 'ivar' call intentOutSub(jvar, ivar) end do call intentInOutSub(jvar, ivar) do ivar = 1,10 call intentInOutSub(jvar, ivar) end do contains subroutine intentInSub(arg1, arg2) integer, intent(in) :: arg1 integer, intent(in) :: arg2 end subroutine intentInSub subroutine intentOutSub(arg1, arg2) integer, intent(in) :: arg1 integer, intent(out) :: arg2 end subroutine intentOutSub subroutine intentInOutSub(arg1, arg2) integer, intent(in) :: arg1 integer, intent(inout) :: arg2 end subroutine intentInOutSub end subroutine s12 subroutine s13() Integer :: ivar, jvar ! This one is OK do ivar = 1, 10 jvar = intentInFunc(ivar) end do ! Error for passing a DO variable to an INTENT(OUT) dummy do ivar = 1, 10 !ERROR: Cannot redefine DO variable 'ivar' jvar = intentOutFunc(ivar) end do ! Error for passing a DO variable to an INTENT(OUT) dummy, more complex ! expression do ivar = 1, 10 !ERROR: Cannot redefine DO variable 'ivar' jvar = 83 + intentInFunc(intentOutFunc(ivar)) end do ! Warning for passing a DO variable to an INTENT(INOUT) dummy do ivar = 1, 10 jvar = intentInOutFunc(ivar) end do contains function intentInFunc(dummyArg) integer, intent(in) :: dummyArg integer :: intentInFunc intentInFunc = 343 end function intentInFunc function intentOutFunc(dummyArg) integer, intent(out) :: dummyArg integer :: intentOutFunc dummyArg = 216 intentOutFunc = 343 end function intentOutFunc function intentInOutFunc(dummyArg) integer, intent(inout) :: dummyArg integer :: intentInOutFunc dummyArg = 216 intentInOutFunc = 343 end function intentInOutFunc end subroutine s13