| ! RUN: %python %S/test_errors.py %s %flang -fopenmp |
| ! OpenMP version 5.0.0 |
| ! 2.13.3 parallel sections Construct |
| ! The restrictions for the parallel construct and the sections construct apply |
| program OmpConstructSections01 |
| use omp_lib |
| integer :: section_count = 0 |
| integer, parameter :: NT = 4 |
| integer :: i, array(10) |
| type my_type |
| integer :: array(10) |
| end type my_type |
| type(my_type) :: my_var |
| print *, 'section_count', section_count |
| do i = 1, 10 |
| array(i) = i |
| end do |
| !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause |
| !$omp parallel sections shared(array(i)) |
| !$omp end parallel sections |
| !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause |
| !$omp parallel sections shared(my_var%array) |
| !$omp end parallel sections |
| |
| !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 |
| !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause |
| !$omp parallel sections private(my_var%array) |
| !$omp section |
| print *, "This is a single statement structured block" |
| !$omp section |
| 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 parallel sections |
| 10 print *, 'Jump from section' |
| !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause |
| !$omp parallel sections private(array(i)) |
| !$omp section |
| 40 print *, 'Error in opening file' |
| !$omp end parallel sections |
| end program OmpConstructSections01 |
| |
| function returnFromSections() |
| !$omp parallel sections |
| !$omp section |
| !ERROR: RETURN statement is not allowed in a PARALLEL SECTIONS construct |
| RETURN |
| !$omp end parallel 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 parallel sections |
| !$omp section |
| IF (i .EQ. 5) THEN |
| !ERROR: CYCLE to construct outside of PARALLEL SECTIONS construct is not allowed |
| CYCLE |
| END IF |
| !$omp end parallel sections |
| print *, "Statement within loop but outside section contruct" |
| end do |
| |
| !$omp parallel sections |
| !$omp section |
| do i = 1, 10 |
| CYCLE |
| end do |
| !$omp end parallel sections |
| |
| !$omp parallel 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 parallel sections |
| |
| loop_2: do i = 1, 10 |
| !$omp parallel sections |
| !$omp section |
| IF (i .EQ. 5) THEN |
| !ERROR: CYCLE to construct 'loop_2' outside of PARALLEL SECTIONS construct is not allowed |
| CYCLE loop_2 |
| END IF |
| !$omp end parallel sections |
| end do loop_2 |
| end subroutine continueWithinSections |
| |
| subroutine breakWithinSections() |
| loop_3: do i = 1, 10 |
| !$omp parallel sections |
| !$omp section |
| IF (i .EQ. 5) THEN |
| !ERROR: EXIT to construct 'loop_3' outside of PARALLEL SECTIONS construct is not allowed |
| EXIT loop_3 |
| END IF |
| !$omp end parallel sections |
| end do loop_3 |
| |
| loop_4: do i = 1, 10 |
| !$omp parallel sections |
| !$omp section |
| IF (i .EQ. 5) THEN |
| !ERROR: EXIT to construct outside of PARALLEL SECTIONS construct is not allowed |
| EXIT |
| END IF |
| !$omp end parallel sections |
| end do loop_4 |
| |
| !$omp parallel sections |
| !$omp section |
| do i = 1, 10 |
| IF (i .EQ. 5) THEN |
| EXIT |
| END IF |
| end do |
| !$omp end parallel sections |
| |
| !$omp parallel 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 parallel sections |
| end subroutine breakWithinSections |