xref: /llvm-project/flang/test/Semantics/dosemantics12.f90 (revision 90828d67ea35c86b76fc8f3dec5da03f645eadaf)
1*90828d67SPeter Klausler! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
264ab3302SCarolineConcatto! Copyright (c) 2019, NVIDIA CORPORATION.  All rights reserved.
364ab3302SCarolineConcatto!
464ab3302SCarolineConcatto! Licensed under the Apache License, Version 2.0 (the "License");
564ab3302SCarolineConcatto! you may not use this file except in compliance with the License.
664ab3302SCarolineConcatto! You may obtain a copy of the License at
764ab3302SCarolineConcatto!
864ab3302SCarolineConcatto!     http://www.apache.org/licenses/LICENSE-2.0
964ab3302SCarolineConcatto!
1064ab3302SCarolineConcatto! Unless required by applicable law or agreed to in writing, software
1164ab3302SCarolineConcatto! distributed under the License is distributed on an "AS IS" BASIS,
1264ab3302SCarolineConcatto! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364ab3302SCarolineConcatto! See the License for the specific language governing permissions and
1464ab3302SCarolineConcatto! limitations under the License.
1564ab3302SCarolineConcatto!
1664ab3302SCarolineConcatto!Section 11.1.7.4.3, paragraph 2 states:
1764ab3302SCarolineConcatto!  Except for the incrementation of the DO variable that occurs in step (3),
1864ab3302SCarolineConcatto!  the DO variable shall neither be redefined nor become undefined while the
1964ab3302SCarolineConcatto!  DO construct is active.
2064ab3302SCarolineConcatto
2164ab3302SCarolineConcattosubroutine s1()
2264ab3302SCarolineConcatto
2364ab3302SCarolineConcatto  ! Redefinition via intrinsic assignment (section 19.6.5, case (1))
2464ab3302SCarolineConcatto  do ivar = 1,20
2564ab3302SCarolineConcatto    print *, "hello"
2664ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
2764ab3302SCarolineConcatto    ivar = 99
2864ab3302SCarolineConcatto  end do
2964ab3302SCarolineConcatto
3064ab3302SCarolineConcatto  ! Redefinition in the presence of a construct association
3164ab3302SCarolineConcatto  associate (avar => ivar)
3264ab3302SCarolineConcatto    do ivar = 1,20
3364ab3302SCarolineConcatto      print *, "hello"
3464ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
3564ab3302SCarolineConcatto      avar = 99
3664ab3302SCarolineConcatto    end do
3764ab3302SCarolineConcatto  end associate
3864ab3302SCarolineConcatto
3964ab3302SCarolineConcatto  ivar = 99
4064ab3302SCarolineConcatto
4164ab3302SCarolineConcatto  ! Redefinition via intrinsic assignment (section 19.6.5, case (1))
4264ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
4364ab3302SCarolineConcatto    print *, "hello"
4464ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
4564ab3302SCarolineConcatto    ivar = 99
4664ab3302SCarolineConcatto  end do
4764ab3302SCarolineConcatto
4864ab3302SCarolineConcatto  ivar = 99
4964ab3302SCarolineConcatto
5064ab3302SCarolineConcattoend subroutine s1
5164ab3302SCarolineConcatto
5264ab3302SCarolineConcattosubroutine s2()
5364ab3302SCarolineConcatto
5464ab3302SCarolineConcatto  integer :: ivar
5564ab3302SCarolineConcatto
5664ab3302SCarolineConcatto  read '(I10)', ivar
5764ab3302SCarolineConcatto
5864ab3302SCarolineConcatto  ! Redefinition via an input statement (section 19.6.5, case (3))
5964ab3302SCarolineConcatto  do ivar = 1,20
6064ab3302SCarolineConcatto    print *, "hello"
6164ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
6264ab3302SCarolineConcatto    read '(I10)', ivar
6364ab3302SCarolineConcatto  end do
6464ab3302SCarolineConcatto
6564ab3302SCarolineConcatto  ! Redefinition via an input statement (section 19.6.5, case (3))
6664ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
6764ab3302SCarolineConcatto    print *, "hello"
6864ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
6964ab3302SCarolineConcatto    read '(I10)', ivar
7064ab3302SCarolineConcatto  end do
7164ab3302SCarolineConcatto
7264ab3302SCarolineConcattoend subroutine s2
7364ab3302SCarolineConcatto
7464ab3302SCarolineConcattosubroutine s3()
7564ab3302SCarolineConcatto
7664ab3302SCarolineConcatto  integer :: ivar
7764ab3302SCarolineConcatto
7864ab3302SCarolineConcatto  ! Redefinition via use as a DO variable (section 19.6.5, case (4))
7964ab3302SCarolineConcatto  do ivar = 1,10
8064ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
8164ab3302SCarolineConcatto    do ivar = 1,20
8264ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
8364ab3302SCarolineConcatto      do ivar = 1,30
8464ab3302SCarolineConcatto        print *, "hello"
8564ab3302SCarolineConcatto      end do
8664ab3302SCarolineConcatto    end do
8764ab3302SCarolineConcatto  end do
8864ab3302SCarolineConcatto
8964ab3302SCarolineConcatto  ! This one's OK, even though we used ivar previously as a DO variable
9064ab3302SCarolineConcatto  ! since it's not a redefinition
9164ab3302SCarolineConcatto  do ivar = 1,40
9264ab3302SCarolineConcatto    print *, "hello"
9364ab3302SCarolineConcatto  end do
9464ab3302SCarolineConcatto
9564ab3302SCarolineConcatto  ! Redefinition via use as a DO variable (section 19.6.5, case (4))
9664ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
9764ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
9864ab3302SCarolineConcatto    do ivar = 1,20
9964ab3302SCarolineConcatto      print *, "hello"
10064ab3302SCarolineConcatto    end do
10164ab3302SCarolineConcatto  end do
10264ab3302SCarolineConcatto
10364ab3302SCarolineConcattoend subroutine s3
10464ab3302SCarolineConcatto
10564ab3302SCarolineConcattosubroutine s4()
10664ab3302SCarolineConcatto
10764ab3302SCarolineConcatto  integer :: ivar
10864ab3302SCarolineConcatto  real :: x(10)
10964ab3302SCarolineConcatto
11064ab3302SCarolineConcatto  print '(f10.5)', (x(ivar), ivar = 1, 10)
11164ab3302SCarolineConcatto
11264ab3302SCarolineConcatto  ! Redefinition via use as a DO variable (section 19.6.5, case (5))
11364ab3302SCarolineConcatto  do ivar = 1,20
11464ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
11564ab3302SCarolineConcatto    print '(f10.5)', (x(ivar), ivar = 1, 10)
11664ab3302SCarolineConcatto  end do
11764ab3302SCarolineConcatto
11864ab3302SCarolineConcatto  ! Redefinition via use as a DO variable (section 19.6.5, case (5))
11964ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
12064ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
12164ab3302SCarolineConcatto    print '(f10.5)', (x(ivar), ivar = 1, 10)
12264ab3302SCarolineConcatto  end do
12364ab3302SCarolineConcatto
12464ab3302SCarolineConcattoend subroutine s4
12564ab3302SCarolineConcatto
12664ab3302SCarolineConcattosubroutine s5()
12764ab3302SCarolineConcatto
12864ab3302SCarolineConcatto  integer :: ivar
12964ab3302SCarolineConcatto  real :: x
13064ab3302SCarolineConcatto
13164ab3302SCarolineConcatto  read (3, '(f10.5)', iostat = ivar) x
13264ab3302SCarolineConcatto
13364ab3302SCarolineConcatto  ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (7))
13464ab3302SCarolineConcatto  do ivar = 1,20
13564ab3302SCarolineConcatto    print *, "hello"
13664ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
13764ab3302SCarolineConcatto    read (3, '(f10.5)', iostat = ivar) x
13864ab3302SCarolineConcatto  end do
13964ab3302SCarolineConcatto
14064ab3302SCarolineConcatto  ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (7))
14164ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
14264ab3302SCarolineConcatto    print *, "hello"
14364ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
14464ab3302SCarolineConcatto    read (3, '(f10.5)', iostat = ivar) x
14564ab3302SCarolineConcatto  end do
14664ab3302SCarolineConcatto
14764ab3302SCarolineConcattoend subroutine s5
14864ab3302SCarolineConcatto
14964ab3302SCarolineConcattosubroutine s6()
15064ab3302SCarolineConcatto
15164ab3302SCarolineConcatto  character (len=3) :: key
15264ab3302SCarolineConcatto  integer :: chars
15364ab3302SCarolineConcatto  integer :: ivar
15464ab3302SCarolineConcatto  real :: x
15564ab3302SCarolineConcatto
15664ab3302SCarolineConcatto  read (3, '(a3)', advance='no', size = chars) key
15764ab3302SCarolineConcatto
15864ab3302SCarolineConcatto  ! Redefinition via use in SIZE specifier (section 19.6.5, case (9))
15964ab3302SCarolineConcatto  do ivar = 1,20
16064ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
16164ab3302SCarolineConcatto    read (3, '(a3)', advance='no', size = ivar) key
16264ab3302SCarolineConcatto    print *, "hello"
16364ab3302SCarolineConcatto  end do
16464ab3302SCarolineConcatto
16564ab3302SCarolineConcatto  ! Redefinition via use in SIZE specifier (section 19.6.5, case (9))
16664ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
16764ab3302SCarolineConcatto!ERROR: ADVANCE specifier is not allowed in DO CONCURRENT
16864ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
16964ab3302SCarolineConcatto    read (3, '(a3)', advance='no', size = ivar) key
17064ab3302SCarolineConcatto    print *, "hello"
17164ab3302SCarolineConcatto  end do
17264ab3302SCarolineConcatto
17364ab3302SCarolineConcattoend subroutine s6
17464ab3302SCarolineConcatto
17564ab3302SCarolineConcattosubroutine s7()
17664ab3302SCarolineConcatto
17764ab3302SCarolineConcatto  integer :: iostatVar, nextrecVar, numberVar, posVar, reclVar, sizeVar
17864ab3302SCarolineConcatto
17964ab3302SCarolineConcatto  inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
18064ab3302SCarolineConcatto    pos=posVar, recl=reclVar, size=sizeVar)
18164ab3302SCarolineConcatto
18264ab3302SCarolineConcatto  ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (10))
18364ab3302SCarolineConcatto  do iostatVar = 1,20
18464ab3302SCarolineConcatto    print *, "hello"
18564ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'iostatvar'
18664ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
18764ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
18864ab3302SCarolineConcatto  end do
18964ab3302SCarolineConcatto
19064ab3302SCarolineConcatto  ! Redefinition via use in IOSTAT specifier (section 19.6.5, case (10))
19164ab3302SCarolineConcatto  do concurrent (iostatVar = 1:10)
19264ab3302SCarolineConcatto    print *, "hello"
19364ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'iostatvar'
19464ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
19564ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
19664ab3302SCarolineConcatto  end do
19764ab3302SCarolineConcatto
19864ab3302SCarolineConcatto  ! Redefinition via use in NEXTREC specifier (section 19.6.5, case (10))
19964ab3302SCarolineConcatto  do nextrecVar = 1,20
20064ab3302SCarolineConcatto    print *, "hello"
20164ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'nextrecvar'
20264ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
20364ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
20464ab3302SCarolineConcatto  end do
20564ab3302SCarolineConcatto
20664ab3302SCarolineConcatto  ! Redefinition via use in NEXTREC specifier (section 19.6.5, case (10))
20764ab3302SCarolineConcatto  do concurrent (nextrecVar = 1:10)
20864ab3302SCarolineConcatto    print *, "hello"
20964ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'nextrecvar'
21064ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
21164ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
21264ab3302SCarolineConcatto  end do
21364ab3302SCarolineConcatto
21464ab3302SCarolineConcatto  ! Redefinition via use in NUMBER specifier (section 19.6.5, case (10))
21564ab3302SCarolineConcatto  do numberVar = 1,20
21664ab3302SCarolineConcatto    print *, "hello"
21764ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'numbervar'
21864ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
21964ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
22064ab3302SCarolineConcatto  end do
22164ab3302SCarolineConcatto
22264ab3302SCarolineConcatto  ! Redefinition via use in NUMBER specifier (section 19.6.5, case (10))
22364ab3302SCarolineConcatto  do concurrent (numberVar = 1:10)
22464ab3302SCarolineConcatto    print *, "hello"
22564ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'numbervar'
22664ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
22764ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
22864ab3302SCarolineConcatto  end do
22964ab3302SCarolineConcatto
23064ab3302SCarolineConcatto  ! Redefinition via use in RECL specifier (section 19.6.5, case (10))
23164ab3302SCarolineConcatto  do reclVar = 1,20
23264ab3302SCarolineConcatto    print *, "hello"
23364ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
23464ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'reclvar'
23564ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
23664ab3302SCarolineConcatto  end do
23764ab3302SCarolineConcatto
23864ab3302SCarolineConcatto  ! Redefinition via use in RECL specifier (section 19.6.5, case (10))
23964ab3302SCarolineConcatto  do concurrent (reclVar = 1:10)
24064ab3302SCarolineConcatto    print *, "hello"
24164ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
24264ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'reclvar'
24364ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
24464ab3302SCarolineConcatto  end do
24564ab3302SCarolineConcatto
24664ab3302SCarolineConcatto  ! Redefinition via use in POS specifier (section 19.6.5, case (10))
24764ab3302SCarolineConcatto  do posVar = 1,20
24864ab3302SCarolineConcatto    print *, "hello"
24964ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
25064ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'posvar'
25164ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
25264ab3302SCarolineConcatto  end do
25364ab3302SCarolineConcatto
25464ab3302SCarolineConcatto  ! Redefinition via use in POS specifier (section 19.6.5, case (10))
25564ab3302SCarolineConcatto  do concurrent (posVar = 1:10)
25664ab3302SCarolineConcatto    print *, "hello"
25764ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
25864ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'posvar'
25964ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
26064ab3302SCarolineConcatto  end do
26164ab3302SCarolineConcatto
26264ab3302SCarolineConcatto  ! Redefinition via use in SIZE specifier (section 19.6.5, case (10))
26364ab3302SCarolineConcatto  do sizeVar = 1,20
26464ab3302SCarolineConcatto    print *, "hello"
26564ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
26664ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'sizevar'
26764ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
26864ab3302SCarolineConcatto  end do
26964ab3302SCarolineConcatto
27064ab3302SCarolineConcatto  ! Redefinition via use in SIZE specifier (section 19.6.5, case (10))
27164ab3302SCarolineConcatto  do concurrent (sizeVar = 1:10)
27264ab3302SCarolineConcatto    print *, "hello"
27364ab3302SCarolineConcatto    inquire(3, iostat=iostatVar, nextrec=nextrecVar, number=numberVar, &
27464ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'sizevar'
27564ab3302SCarolineConcatto      pos=posVar, recl=reclVar, size=sizeVar)
27664ab3302SCarolineConcatto  end do
27764ab3302SCarolineConcatto
27864ab3302SCarolineConcattoend subroutine s7
27964ab3302SCarolineConcatto
28064ab3302SCarolineConcattosubroutine s8()
28164ab3302SCarolineConcatto
28264ab3302SCarolineConcatto  Integer :: ivar
28364ab3302SCarolineConcatto  integer, pointer :: ip
28464ab3302SCarolineConcatto
28564ab3302SCarolineConcatto  allocate(ip, stat = ivar)
28664ab3302SCarolineConcatto
28764ab3302SCarolineConcatto  ! Redefinition via a STAT= specifier (section 19.6.5, case (16))
28864ab3302SCarolineConcatto  do ivar = 1,20
28964ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
29064ab3302SCarolineConcatto    allocate(ip, stat = ivar)
29164ab3302SCarolineConcatto    print *, "hello"
29264ab3302SCarolineConcatto  end do
29364ab3302SCarolineConcatto
29464ab3302SCarolineConcatto  ! Redefinition via a STAT= specifier (section 19.6.5, case (16))
29564ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
29664ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
29764ab3302SCarolineConcatto    allocate(ip, stat = ivar)
29864ab3302SCarolineConcatto    print *, "hello"
29964ab3302SCarolineConcatto  end do
30064ab3302SCarolineConcatto
30164ab3302SCarolineConcattoend subroutine s8
30264ab3302SCarolineConcatto
30364ab3302SCarolineConcattosubroutine s9()
30464ab3302SCarolineConcatto
30564ab3302SCarolineConcatto  Integer :: ivar
30664ab3302SCarolineConcatto
30764ab3302SCarolineConcatto  ! OK since the DO CONCURRENT index-name exists only in the scope of the
30864ab3302SCarolineConcatto  ! DO CONCURRENT construct
30964ab3302SCarolineConcatto  do ivar = 1,20
31064ab3302SCarolineConcatto    print *, "hello"
31164ab3302SCarolineConcatto    do concurrent (ivar = 1:10)
31264ab3302SCarolineConcatto      print *, "hello"
31364ab3302SCarolineConcatto    end do
31464ab3302SCarolineConcatto  end do
31564ab3302SCarolineConcatto
316*90828d67SPeter Klausler  ! Technically non-conformant (F'2023 19.4 p8)
31764ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
31864ab3302SCarolineConcatto    print *, "hello"
319*90828d67SPeter Klausler    !PORTABILITY: Index variable 'ivar' should not also be an index in an enclosing FORALL or DO CONCURRENT
32064ab3302SCarolineConcatto    do concurrent (ivar = 1:10)
32164ab3302SCarolineConcatto      print *, "hello"
32264ab3302SCarolineConcatto    end do
32364ab3302SCarolineConcatto  end do
32464ab3302SCarolineConcatto
32564ab3302SCarolineConcattoend subroutine s9
32664ab3302SCarolineConcatto
32764ab3302SCarolineConcattosubroutine s10()
32864ab3302SCarolineConcatto
32964ab3302SCarolineConcatto  Integer :: ivar
33064ab3302SCarolineConcatto  open(file="abc", newunit=ivar)
33164ab3302SCarolineConcatto
33264ab3302SCarolineConcatto  ! Redefinition via NEWUNIT specifier (section 19.6.5, case (29))
33364ab3302SCarolineConcatto  do ivar = 1,20
33464ab3302SCarolineConcatto    print *, "hello"
33564ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
33664ab3302SCarolineConcatto    open(file="abc", newunit=ivar)
33764ab3302SCarolineConcatto  end do
33864ab3302SCarolineConcatto
33964ab3302SCarolineConcatto  ! Redefinition via NEWUNIT specifier (section 19.6.5, case (29))
34064ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
34164ab3302SCarolineConcatto    print *, "hello"
34264ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
34364ab3302SCarolineConcatto    open(file="abc", newunit=ivar)
34464ab3302SCarolineConcatto  end do
34564ab3302SCarolineConcatto
34664ab3302SCarolineConcattoend subroutine s10
34764ab3302SCarolineConcatto
34864ab3302SCarolineConcattosubroutine s11()
34964ab3302SCarolineConcatto
35064ab3302SCarolineConcatto  Integer, allocatable :: ivar
35164ab3302SCarolineConcatto
35264ab3302SCarolineConcatto  allocate(ivar)
35364ab3302SCarolineConcatto
35464ab3302SCarolineConcatto  ! This look is OK
35564ab3302SCarolineConcatto  do ivar = 1,20
35664ab3302SCarolineConcatto    print *, "hello"
35764ab3302SCarolineConcatto  end do
35864ab3302SCarolineConcatto
35964ab3302SCarolineConcatto  ! Redefinition via deallocation (section 19.6.6, case (10))
36064ab3302SCarolineConcatto  do ivar = 1,20
36164ab3302SCarolineConcatto    print *, "hello"
36264ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
36364ab3302SCarolineConcatto    deallocate(ivar)
36464ab3302SCarolineConcatto  end do
36564ab3302SCarolineConcatto
36664ab3302SCarolineConcatto  ! This case is not applicable since the version of "ivar" that's inside the
36764ab3302SCarolineConcatto  ! DO CONCURRENT has the scope of the DO CONCURRENT construct.  Within that
36864ab3302SCarolineConcatto  ! scope, it does not have the "allocatable" attribute, so the following test
36964ab3302SCarolineConcatto  ! fails because you can only deallocate a variable that's allocatable.
37064ab3302SCarolineConcatto  do concurrent (ivar = 1:10)
37164ab3302SCarolineConcatto    print *, "hello"
372fb792ebaSPeter Klausler!ERROR: Name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute
37364ab3302SCarolineConcatto    deallocate(ivar)
37464ab3302SCarolineConcatto  end do
37564ab3302SCarolineConcatto
37664ab3302SCarolineConcattoend subroutine s11
37764ab3302SCarolineConcatto
37864ab3302SCarolineConcattosubroutine s12()
37964ab3302SCarolineConcatto
38064ab3302SCarolineConcatto  Integer :: ivar, jvar
38164ab3302SCarolineConcatto
38264ab3302SCarolineConcatto  call intentInSub(jvar, ivar)
38364ab3302SCarolineConcatto  do ivar = 1,10
38464ab3302SCarolineConcatto    call intentInSub(jvar, ivar)
38564ab3302SCarolineConcatto  end do
38664ab3302SCarolineConcatto
38764ab3302SCarolineConcatto  call intentOutSub(jvar, ivar)
38864ab3302SCarolineConcatto  do ivar = 1,10
38964ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
39064ab3302SCarolineConcatto    call intentOutSub(jvar, ivar)
39164ab3302SCarolineConcatto  end do
39264ab3302SCarolineConcatto
39364ab3302SCarolineConcatto  call intentInOutSub(jvar, ivar)
39464ab3302SCarolineConcatto  do ivar = 1,10
39593dca9fbSEmil Kieri    !WARNING: Possible redefinition of DO variable 'ivar'
39664ab3302SCarolineConcatto    call intentInOutSub(jvar, ivar)
39764ab3302SCarolineConcatto  end do
39864ab3302SCarolineConcatto
39964ab3302SCarolineConcattocontains
40064ab3302SCarolineConcatto  subroutine intentInSub(arg1, arg2)
40164ab3302SCarolineConcatto    integer, intent(in) :: arg1
40264ab3302SCarolineConcatto    integer, intent(in) :: arg2
40364ab3302SCarolineConcatto  end subroutine intentInSub
40464ab3302SCarolineConcatto
40564ab3302SCarolineConcatto  subroutine intentOutSub(arg1, arg2)
40664ab3302SCarolineConcatto    integer, intent(in) :: arg1
40764ab3302SCarolineConcatto    integer, intent(out) :: arg2
40864ab3302SCarolineConcatto  end subroutine intentOutSub
40964ab3302SCarolineConcatto
41064ab3302SCarolineConcatto  subroutine intentInOutSub(arg1, arg2)
41164ab3302SCarolineConcatto    integer, intent(in) :: arg1
41264ab3302SCarolineConcatto    integer, intent(inout) :: arg2
41364ab3302SCarolineConcatto  end subroutine intentInOutSub
41464ab3302SCarolineConcatto
41564ab3302SCarolineConcattoend subroutine s12
41664ab3302SCarolineConcatto
41764ab3302SCarolineConcattosubroutine s13()
41864ab3302SCarolineConcatto
41964ab3302SCarolineConcatto  Integer :: ivar, jvar
42064ab3302SCarolineConcatto
42164ab3302SCarolineConcatto  ! This one is OK
42264ab3302SCarolineConcatto  do ivar = 1, 10
42364ab3302SCarolineConcatto    jvar = intentInFunc(ivar)
42464ab3302SCarolineConcatto  end do
42564ab3302SCarolineConcatto
42664ab3302SCarolineConcatto  ! Error for passing a DO variable to an INTENT(OUT) dummy
42764ab3302SCarolineConcatto  do ivar = 1, 10
42864ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
42964ab3302SCarolineConcatto    jvar = intentOutFunc(ivar)
43064ab3302SCarolineConcatto  end do
43164ab3302SCarolineConcatto
43264ab3302SCarolineConcatto  ! Error for passing a DO variable to an INTENT(OUT) dummy, more complex
43364ab3302SCarolineConcatto  ! expression
43464ab3302SCarolineConcatto  do ivar = 1, 10
43564ab3302SCarolineConcatto!ERROR: Cannot redefine DO variable 'ivar'
43664ab3302SCarolineConcatto    jvar = 83 + intentInFunc(intentOutFunc(ivar))
43764ab3302SCarolineConcatto  end do
43864ab3302SCarolineConcatto
43964ab3302SCarolineConcatto  do ivar = 1, 10
44093dca9fbSEmil Kieri    !WARNING: Possible redefinition of DO variable 'ivar'
44164ab3302SCarolineConcatto    jvar = intentInOutFunc(ivar)
44264ab3302SCarolineConcatto  end do
44364ab3302SCarolineConcatto
44464ab3302SCarolineConcattocontains
44564ab3302SCarolineConcatto  function intentInFunc(dummyArg)
44664ab3302SCarolineConcatto    integer, intent(in) :: dummyArg
44764ab3302SCarolineConcatto    integer  :: intentInFunc
44864ab3302SCarolineConcatto
44964ab3302SCarolineConcatto    intentInFunc = 343
45064ab3302SCarolineConcatto  end function intentInFunc
45164ab3302SCarolineConcatto
45264ab3302SCarolineConcatto  function intentOutFunc(dummyArg)
45364ab3302SCarolineConcatto    integer, intent(out) :: dummyArg
45464ab3302SCarolineConcatto    integer  :: intentOutFunc
45564ab3302SCarolineConcatto
45664ab3302SCarolineConcatto    dummyArg = 216
45764ab3302SCarolineConcatto    intentOutFunc = 343
45864ab3302SCarolineConcatto  end function intentOutFunc
45964ab3302SCarolineConcatto
46064ab3302SCarolineConcatto  function intentInOutFunc(dummyArg)
46164ab3302SCarolineConcatto    integer, intent(inout) :: dummyArg
46264ab3302SCarolineConcatto    integer  :: intentInOutFunc
46364ab3302SCarolineConcatto
46464ab3302SCarolineConcatto    dummyArg = 216
46564ab3302SCarolineConcatto    intentInOutFunc = 343
46664ab3302SCarolineConcatto  end function intentInOutFunc
46764ab3302SCarolineConcatto
46864ab3302SCarolineConcattoend subroutine s13
469