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