xref: /llvm-project/flang/test/Semantics/dosemantics11.f90 (revision 6c1ac141d3c98af9738bc77fcb55602cbff7751f)
1*6c1ac141SIvan Zhechev! RUN: %python %S/test_errors.py %s %flang_fc1
264ab3302SCarolineConcatto! C1135 A cycle-stmt shall not appear within a CHANGE TEAM, CRITICAL, or DO
364ab3302SCarolineConcatto! CONCURRENT construct if it belongs to an outer construct.
464ab3302SCarolineConcatto!
564ab3302SCarolineConcatto! C1167 -- An exit-stmt shall not appear within a DO CONCURRENT construct if
664ab3302SCarolineConcatto! it belongs to that construct or an outer construct.
764ab3302SCarolineConcatto!
864ab3302SCarolineConcatto! C1168 -- An exit-stmt shall not appear within a CHANGE TEAM or CRITICAL
964ab3302SCarolineConcatto! construct if it belongs to an outer construct.
1064ab3302SCarolineConcatto
1164ab3302SCarolineConcattosubroutine s1()
1264ab3302SCarolineConcatto!ERROR: No matching DO construct for CYCLE statement
1364ab3302SCarolineConcatto  cycle
1464ab3302SCarolineConcattoend subroutine s1
1564ab3302SCarolineConcatto
1664ab3302SCarolineConcattosubroutine s2()
1764ab3302SCarolineConcatto!ERROR: No matching construct for EXIT statement
1864ab3302SCarolineConcatto  exit
1964ab3302SCarolineConcattoend subroutine s2
2064ab3302SCarolineConcatto
2164ab3302SCarolineConcattosubroutine s3()
2264ab3302SCarolineConcatto  level0: block
2364ab3302SCarolineConcatto!ERROR: No matching DO construct for CYCLE statement
2464ab3302SCarolineConcatto    cycle level0
2564ab3302SCarolineConcatto  end block level0
2664ab3302SCarolineConcattoend subroutine s3
2764ab3302SCarolineConcatto
2864ab3302SCarolineConcattosubroutine s4()
2964ab3302SCarolineConcatto  level0: do i = 1, 10
3064ab3302SCarolineConcatto    level1: do concurrent (j = 1:20)
3164ab3302SCarolineConcatto!ERROR: CYCLE must not leave a DO CONCURRENT statement
3264ab3302SCarolineConcatto      cycle level0
3364ab3302SCarolineConcatto    end do level1
3464ab3302SCarolineConcatto  end do level0
3564ab3302SCarolineConcattoend subroutine s4
3664ab3302SCarolineConcatto
3764ab3302SCarolineConcattosubroutine s5()
3864ab3302SCarolineConcatto  level0: do i = 1, 10
3964ab3302SCarolineConcatto    level1: do concurrent (j = 1:20)
4064ab3302SCarolineConcatto!ERROR: EXIT must not leave a DO CONCURRENT statement
4164ab3302SCarolineConcatto      exit level0
4264ab3302SCarolineConcatto    end do level1
4364ab3302SCarolineConcatto  end do level0
4464ab3302SCarolineConcattoend subroutine s5
4564ab3302SCarolineConcatto
4664ab3302SCarolineConcattosubroutine s6()
4764ab3302SCarolineConcatto  level0: do i = 1, 10
4864ab3302SCarolineConcatto    level1: critical
4964ab3302SCarolineConcatto!ERROR: CYCLE must not leave a CRITICAL statement
5064ab3302SCarolineConcatto      cycle level0
5164ab3302SCarolineConcatto    end critical level1
5264ab3302SCarolineConcatto  end do level0
5364ab3302SCarolineConcattoend subroutine s6
5464ab3302SCarolineConcatto
5564ab3302SCarolineConcattosubroutine s7()
5664ab3302SCarolineConcatto  level0: do i = 1, 10
5764ab3302SCarolineConcatto    level1: critical
5864ab3302SCarolineConcatto!ERROR: EXIT must not leave a CRITICAL statement
5964ab3302SCarolineConcatto      exit level0
6064ab3302SCarolineConcatto    end critical level1
6164ab3302SCarolineConcatto  end do level0
6264ab3302SCarolineConcattoend subroutine s7
6364ab3302SCarolineConcatto
6464ab3302SCarolineConcattosubroutine s8()
6564ab3302SCarolineConcatto  use :: iso_fortran_env
6664ab3302SCarolineConcatto  type(team_type) team_var
6764ab3302SCarolineConcatto
6864ab3302SCarolineConcatto  level0: do i = 1, 10
6964ab3302SCarolineConcatto    level1: change team(team_var)
7064ab3302SCarolineConcatto!ERROR: CYCLE must not leave a CHANGE TEAM statement
7164ab3302SCarolineConcatto      cycle level0
7264ab3302SCarolineConcatto    end team level1
7364ab3302SCarolineConcatto  end do level0
7464ab3302SCarolineConcattoend subroutine s8
7564ab3302SCarolineConcatto
7664ab3302SCarolineConcattosubroutine s9()
7764ab3302SCarolineConcatto  use :: iso_fortran_env
7864ab3302SCarolineConcatto  type(team_type) team_var
7964ab3302SCarolineConcatto
8064ab3302SCarolineConcatto  level0: do i = 1, 10
8164ab3302SCarolineConcatto    level1: change team(team_var)
8264ab3302SCarolineConcatto!ERROR: EXIT must not leave a CHANGE TEAM statement
8364ab3302SCarolineConcatto      exit level0
8464ab3302SCarolineConcatto    end team level1
8564ab3302SCarolineConcatto  end do level0
8664ab3302SCarolineConcattoend subroutine s9
8764ab3302SCarolineConcatto
8864ab3302SCarolineConcattosubroutine s10(table)
8964ab3302SCarolineConcatto! A complex, but all legal example
9064ab3302SCarolineConcatto
9164ab3302SCarolineConcatto  integer :: table(..)
9264ab3302SCarolineConcatto
9364ab3302SCarolineConcatto  type point
9464ab3302SCarolineConcatto    real :: x, y
9564ab3302SCarolineConcatto  end type point
9664ab3302SCarolineConcatto
9764ab3302SCarolineConcatto  type, extends(point) :: color_point
9864ab3302SCarolineConcatto    integer :: color
9964ab3302SCarolineConcatto  end type color_point
10064ab3302SCarolineConcatto
10164ab3302SCarolineConcatto  type(point), target :: target_var
10264ab3302SCarolineConcatto  class(point), pointer :: p_or_c
10364ab3302SCarolineConcatto
10464ab3302SCarolineConcatto  p_or_c => target_var
10564ab3302SCarolineConcatto  level0: do i = 1, 10
10664ab3302SCarolineConcatto    level1: associate (avar => ivar)
10764ab3302SCarolineConcatto      level2: block
10864ab3302SCarolineConcatto        level3: select case (l)
10964ab3302SCarolineConcatto          case default
11064ab3302SCarolineConcatto            print*, "default"
11164ab3302SCarolineConcatto          case (1)
11264ab3302SCarolineConcatto            level4: if (.true.) then
11364ab3302SCarolineConcatto              level5: select rank(table)
11464ab3302SCarolineConcatto                rank default
11564ab3302SCarolineConcatto                  level6: select type ( a => p_or_c )
11664ab3302SCarolineConcatto                  type is ( point )
11764ab3302SCarolineConcatto                    cycle level0
11864ab3302SCarolineConcatto                end select level6
11964ab3302SCarolineConcatto              end select level5
12064ab3302SCarolineConcatto            end if level4
12164ab3302SCarolineConcatto        end select level3
12264ab3302SCarolineConcatto      end block level2
12364ab3302SCarolineConcatto    end associate level1
12464ab3302SCarolineConcatto  end do level0
12564ab3302SCarolineConcattoend subroutine s10
12664ab3302SCarolineConcatto
12764ab3302SCarolineConcattosubroutine s11(table)
12864ab3302SCarolineConcatto! A complex, but all legal example with a CYCLE statement
12964ab3302SCarolineConcatto
13064ab3302SCarolineConcatto  integer :: table(..)
13164ab3302SCarolineConcatto
13264ab3302SCarolineConcatto  type point
13364ab3302SCarolineConcatto    real :: x, y
13464ab3302SCarolineConcatto  end type point
13564ab3302SCarolineConcatto
13664ab3302SCarolineConcatto  type, extends(point) :: color_point
13764ab3302SCarolineConcatto    integer :: color
13864ab3302SCarolineConcatto  end type color_point
13964ab3302SCarolineConcatto
14064ab3302SCarolineConcatto  type(point), target :: target_var
14164ab3302SCarolineConcatto  class(point), pointer :: p_or_c
14264ab3302SCarolineConcatto
14364ab3302SCarolineConcatto  p_or_c => target_var
14464ab3302SCarolineConcatto  level0: do i = 1, 10
14564ab3302SCarolineConcatto    level1: associate (avar => ivar)
14664ab3302SCarolineConcatto      level2: block
14764ab3302SCarolineConcatto        level3: select case (l)
14864ab3302SCarolineConcatto          case default
14964ab3302SCarolineConcatto            print*, "default"
15064ab3302SCarolineConcatto          case (1)
15164ab3302SCarolineConcatto            level4: if (.true.) then
15264ab3302SCarolineConcatto              level5: select rank(table)
15364ab3302SCarolineConcatto                rank default
15464ab3302SCarolineConcatto                  level6: select type ( a => p_or_c )
15564ab3302SCarolineConcatto                  type is ( point )
15664ab3302SCarolineConcatto                    cycle level0
15764ab3302SCarolineConcatto                end select level6
15864ab3302SCarolineConcatto              end select level5
15964ab3302SCarolineConcatto            end if level4
16064ab3302SCarolineConcatto        end select level3
16164ab3302SCarolineConcatto      end block level2
16264ab3302SCarolineConcatto    end associate level1
16364ab3302SCarolineConcatto  end do level0
16464ab3302SCarolineConcattoend subroutine s11
16564ab3302SCarolineConcatto
16664ab3302SCarolineConcattosubroutine s12(table)
16764ab3302SCarolineConcatto! A complex, but all legal example with an EXIT statement
16864ab3302SCarolineConcatto
16964ab3302SCarolineConcatto  integer :: table(..)
17064ab3302SCarolineConcatto
17164ab3302SCarolineConcatto  type point
17264ab3302SCarolineConcatto    real :: x, y
17364ab3302SCarolineConcatto  end type point
17464ab3302SCarolineConcatto
17564ab3302SCarolineConcatto  type, extends(point) :: color_point
17664ab3302SCarolineConcatto    integer :: color
17764ab3302SCarolineConcatto  end type color_point
17864ab3302SCarolineConcatto
17964ab3302SCarolineConcatto  type(point), target :: target_var
18064ab3302SCarolineConcatto  class(point), pointer :: p_or_c
18164ab3302SCarolineConcatto
18264ab3302SCarolineConcatto  p_or_c => target_var
18364ab3302SCarolineConcatto  level0: do i = 1, 10
18464ab3302SCarolineConcatto    level1: associate (avar => ivar)
18564ab3302SCarolineConcatto      level2: block
18664ab3302SCarolineConcatto        level3: select case (l)
18764ab3302SCarolineConcatto          case default
18864ab3302SCarolineConcatto            print*, "default"
18964ab3302SCarolineConcatto          case (1)
19064ab3302SCarolineConcatto            level4: if (.true.) then
19164ab3302SCarolineConcatto              level5: select rank(table)
19264ab3302SCarolineConcatto                rank default
19364ab3302SCarolineConcatto                  level6: select type ( a => p_or_c )
19464ab3302SCarolineConcatto                  type is ( point )
19564ab3302SCarolineConcatto                    exit level0
19664ab3302SCarolineConcatto                end select level6
19764ab3302SCarolineConcatto              end select level5
19864ab3302SCarolineConcatto            end if level4
19964ab3302SCarolineConcatto        end select level3
20064ab3302SCarolineConcatto      end block level2
20164ab3302SCarolineConcatto    end associate level1
20264ab3302SCarolineConcatto  end do level0
20364ab3302SCarolineConcattoend subroutine s12
20464ab3302SCarolineConcatto
20564ab3302SCarolineConcattosubroutine s13(table)
20664ab3302SCarolineConcatto! Similar example without construct names
20764ab3302SCarolineConcatto
20864ab3302SCarolineConcatto  integer :: table(..)
20964ab3302SCarolineConcatto
21064ab3302SCarolineConcatto  type point
21164ab3302SCarolineConcatto    real :: x, y
21264ab3302SCarolineConcatto  end type point
21364ab3302SCarolineConcatto
21464ab3302SCarolineConcatto  type, extends(point) :: color_point
21564ab3302SCarolineConcatto    integer :: color
21664ab3302SCarolineConcatto  end type color_point
21764ab3302SCarolineConcatto
21864ab3302SCarolineConcatto  type(point), target :: target_var
21964ab3302SCarolineConcatto  class(point), pointer :: p_or_c
22064ab3302SCarolineConcatto
22164ab3302SCarolineConcatto  p_or_c => target_var
22264ab3302SCarolineConcatto  do i = 1, 10
22364ab3302SCarolineConcatto    associate (avar => ivar)
22464ab3302SCarolineConcatto      block
22564ab3302SCarolineConcatto        select case (l)
22664ab3302SCarolineConcatto          case default
22764ab3302SCarolineConcatto            print*, "default"
22864ab3302SCarolineConcatto          case (1)
22964ab3302SCarolineConcatto            if (.true.) then
23064ab3302SCarolineConcatto              select rank(table)
23164ab3302SCarolineConcatto                rank default
23264ab3302SCarolineConcatto                  select type ( a => p_or_c )
23364ab3302SCarolineConcatto                  type is ( point )
23464ab3302SCarolineConcatto                    cycle
23564ab3302SCarolineConcatto                end select
23664ab3302SCarolineConcatto              end select
23764ab3302SCarolineConcatto            end if
23864ab3302SCarolineConcatto        end select
23964ab3302SCarolineConcatto      end block
24064ab3302SCarolineConcatto    end associate
24164ab3302SCarolineConcatto  end do
24264ab3302SCarolineConcattoend subroutine s13
24364ab3302SCarolineConcatto
24464ab3302SCarolineConcattosubroutine s14(table)
24564ab3302SCarolineConcatto
24664ab3302SCarolineConcatto  integer :: table(..)
24764ab3302SCarolineConcatto
24864ab3302SCarolineConcatto  type point
24964ab3302SCarolineConcatto    real :: x, y
25064ab3302SCarolineConcatto  end type point
25164ab3302SCarolineConcatto
25264ab3302SCarolineConcatto  type, extends(point) :: color_point
25364ab3302SCarolineConcatto    integer :: color
25464ab3302SCarolineConcatto  end type color_point
25564ab3302SCarolineConcatto
25664ab3302SCarolineConcatto  type(point), target :: target_var
25764ab3302SCarolineConcatto  class(point), pointer :: p_or_c
25864ab3302SCarolineConcatto
25964ab3302SCarolineConcatto  p_or_c => target_var
26064ab3302SCarolineConcatto  do i = 1, 10
26164ab3302SCarolineConcatto    associate (avar => ivar)
26264ab3302SCarolineConcatto      block
26364ab3302SCarolineConcatto        critical
26464ab3302SCarolineConcatto          select case (l)
26564ab3302SCarolineConcatto            case default
26664ab3302SCarolineConcatto              print*, "default"
26764ab3302SCarolineConcatto            case (1)
26864ab3302SCarolineConcatto              if (.true.) then
26964ab3302SCarolineConcatto                select rank(table)
27064ab3302SCarolineConcatto                  rank default
27164ab3302SCarolineConcatto                    select type ( a => p_or_c )
27264ab3302SCarolineConcatto                    type is ( point )
27364ab3302SCarolineConcatto!ERROR: CYCLE must not leave a CRITICAL statement
27464ab3302SCarolineConcatto                      cycle
27564ab3302SCarolineConcatto!ERROR: EXIT must not leave a CRITICAL statement
27664ab3302SCarolineConcatto                      exit
27764ab3302SCarolineConcatto                  end select
27864ab3302SCarolineConcatto                end select
27964ab3302SCarolineConcatto              end if
28064ab3302SCarolineConcatto          end select
28164ab3302SCarolineConcatto        end critical
28264ab3302SCarolineConcatto      end block
28364ab3302SCarolineConcatto    end associate
28464ab3302SCarolineConcatto  end do
28564ab3302SCarolineConcattoend subroutine s14
28664ab3302SCarolineConcatto
28764ab3302SCarolineConcattosubroutine s15(table)
28864ab3302SCarolineConcatto! Illegal EXIT to an intermediated construct
28964ab3302SCarolineConcatto
29064ab3302SCarolineConcatto  integer :: table(..)
29164ab3302SCarolineConcatto
29264ab3302SCarolineConcatto  type point
29364ab3302SCarolineConcatto    real :: x, y
29464ab3302SCarolineConcatto  end type point
29564ab3302SCarolineConcatto
29664ab3302SCarolineConcatto  type, extends(point) :: color_point
29764ab3302SCarolineConcatto    integer :: color
29864ab3302SCarolineConcatto  end type color_point
29964ab3302SCarolineConcatto
30064ab3302SCarolineConcatto  type(point), target :: target_var
30164ab3302SCarolineConcatto  class(point), pointer :: p_or_c
30264ab3302SCarolineConcatto
30364ab3302SCarolineConcatto  p_or_c => target_var
30464ab3302SCarolineConcatto  level0: do i = 1, 10
30564ab3302SCarolineConcatto    level1: associate (avar => ivar)
30664ab3302SCarolineConcatto      level2: block
30764ab3302SCarolineConcatto        level3: select case (l)
30864ab3302SCarolineConcatto          case default
30964ab3302SCarolineConcatto            print*, "default"
31064ab3302SCarolineConcatto          case (1)
31164ab3302SCarolineConcatto            level4: if (.true.) then
31264ab3302SCarolineConcatto              level5: critical
31364ab3302SCarolineConcatto                level6: select rank(table)
31464ab3302SCarolineConcatto                  rank default
31564ab3302SCarolineConcatto                    level7: select type ( a => p_or_c )
31664ab3302SCarolineConcatto                    type is ( point )
31764ab3302SCarolineConcatto                      exit level6
31864ab3302SCarolineConcatto!ERROR: EXIT must not leave a CRITICAL statement
31964ab3302SCarolineConcatto                      exit level4
32064ab3302SCarolineConcatto                  end select level7
32164ab3302SCarolineConcatto                end select level6
32264ab3302SCarolineConcatto              end critical level5
32364ab3302SCarolineConcatto            end if level4
32464ab3302SCarolineConcatto        end select level3
32564ab3302SCarolineConcatto      end block level2
32664ab3302SCarolineConcatto    end associate level1
32764ab3302SCarolineConcatto  end do level0
32864ab3302SCarolineConcattoend subroutine s15
329