| ! RUN: %python %S/../test_errors.py %s %flang %openmp_flags | |
| ! OpenMP version 5.0.0 | |
| ! 2.8.1 sections construct | |
| ! The code enclosed in a sections construct must be a structured block. | |
| program OmpConstructSections01 | |
| integer :: section_count = 0 | |
| integer, parameter :: NT = 4 | |
| print *, 'section_count', section_count | |
| !ERROR: invalid branch into an OpenMP structured block | |
| !ERROR: invalid branch into an OpenMP structured block | |
| !ERROR: invalid branch into an OpenMP structured block | |
| if (NT) 20, 30, 40 | |
| !ERROR: invalid branch into an OpenMP structured block | |
| goto 20 | |
| !$omp sections | |
| !$omp section | |
| print *, "This is a single statement structured block" | |
| !$omp section | |
| !ERROR: invalid branch into an OpenMP structured block | |
| !ERROR: invalid branch leaving an OpenMP structured block | |
| open (10, file="random-file-name.txt", err=30) | |
| !ERROR: invalid branch into an OpenMP structured block | |
| !ERROR: invalid branch leaving an OpenMP structured block | |
| open (10, file="random-file-name.txt", err=40) | |
| !$omp section | |
| section_count = section_count + 1 | |
| 20 print *, 'Entering into section' | |
| call calledFromWithinSection() | |
| print *, 'section_count', section_count | |
| !$omp section | |
| section_count = section_count + 1 | |
| print *, 'section_count', section_count | |
| !ERROR: invalid branch leaving an OpenMP structured block | |
| goto 10 | |
| !$omp section | |
| 30 print *, "Error in opening file" | |
| !$omp end sections | |
| 10 print *, 'Jump from section' | |
| !$omp sections | |
| !$omp section | |
| 40 print *, 'Error in opening file' | |
| !$omp end sections | |
| end program OmpConstructSections01 | |
| function returnFromSections() | |
| !$omp sections | |
| !$omp section | |
| !ERROR: RETURN statement is not allowed in a SECTIONS construct | |
| RETURN | |
| !$omp end sections | |
| end function | |
| subroutine calledFromWithinSection() | |
| print *, "I am called from within a 'section' structured block" | |
| return | |
| end subroutine calledFromWithinSection | |
| subroutine continueWithinSections() | |
| integer i | |
| do i = 1, 10 | |
| print *, "Statement within loop but outside section construct" | |
| !$omp sections | |
| !$omp section | |
| IF (i .EQ. 5) THEN | |
| !ERROR: CYCLE to construct outside of SECTIONS construct is not allowed | |
| CYCLE | |
| END IF | |
| !$omp end sections | |
| print *, "Statement within loop but outside section contruct" | |
| end do | |
| !$omp sections | |
| !$omp section | |
| do i = 1, 10 | |
| CYCLE | |
| end do | |
| !$omp end sections | |
| !$omp sections | |
| !$omp section | |
| loop_1: do i = 1, 10 | |
| IF (i .EQ. 5) THEN | |
| CYCLE loop_1 | |
| END IF | |
| end do loop_1 | |
| !$omp end sections | |
| loop_2: do i = 1, 10 | |
| !$omp sections | |
| !$omp section | |
| IF (i .EQ. 5) THEN | |
| !ERROR: CYCLE to construct 'loop_2' outside of SECTIONS construct is not allowed | |
| CYCLE loop_2 | |
| END IF | |
| !$omp end sections | |
| end do loop_2 | |
| end subroutine continueWithinSections | |
| subroutine breakWithinSections() | |
| loop_3: do i = 1, 10 | |
| !$omp sections | |
| !$omp section | |
| IF (i .EQ. 5) THEN | |
| !ERROR: EXIT to construct 'loop_3' outside of SECTIONS construct is not allowed | |
| EXIT loop_3 | |
| END IF | |
| !$omp end sections | |
| end do loop_3 | |
| loop_4: do i = 1, 10 | |
| !$omp sections | |
| !$omp section | |
| IF (i .EQ. 5) THEN | |
| !ERROR: EXIT to construct outside of SECTIONS construct is not allowed | |
| EXIT | |
| END IF | |
| !$omp end sections | |
| end do loop_4 | |
| !$omp sections | |
| !$omp section | |
| do i = 1, 10 | |
| IF (i .EQ. 5) THEN | |
| EXIT | |
| END IF | |
| end do | |
| !$omp end sections | |
| !$omp sections | |
| !$omp section | |
| loop_5: do i = 1, 10 | |
| IF (i .EQ. 5) THEN | |
| EXIT loop_5 | |
| END IF | |
| end do loop_5 | |
| !$omp end sections | |
| end subroutine breakWithinSections |