! RUN: %python %S/../test_errors.py %s %flang -fopenmp
! OpenMP Version 4.5
! Various checks with the ordered construct
SUBROUTINE WORK(I)
INTEGER I
END SUBROUTINE WORK
SUBROUTINE ORDERED_GOOD(N)
INTEGER N, I, A(10), B(10), C(10)
!$OMP SIMD
DO I = 1,N
IF (I <= 10) THEN
!$OMP ORDERED SIMD
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END SIMD
END SUBROUTINE ORDERED_GOOD
SUBROUTINE ORDERED_BAD(N)
INTEGER N, I, A(10), B(10), C(10)
!$OMP DO SIMD
DO I = 1,N
IF (I <= 10) THEN
!ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause.
!ERROR: An ORDERED directive without the DEPEND clause must be closely nested in a worksharing-loop (or worksharing-loop SIMD) region with ORDERED clause without the parameter
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END DO SIMD
!$OMP PARALLEL DO
DO I = 1,N
IF (I <= 10) THEN
!ERROR: An ORDERED directive without the DEPEND clause must be closely nested in a worksharing-loop (or worksharing-loop SIMD) region with ORDERED clause without the parameter
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END PARALLEL DO
!$OMP CRITICAL
DO I = 1,N
IF (I <= 10) THEN
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END CRITICAL
!$OMP CRITICAL
WRITE(*,*) I
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
!$OMP END CRITICAL
!$OMP ORDERED
WRITE(*,*) I
IF (I <= 10) THEN
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
!$OMP END ORDERED
!$OMP TASK
C = C - A * B
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
!$OMP END TASK
!$OMP TASKLOOP
DO I = 1,N
IF (I <= 10) THEN
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
ENDIF
END DO
!$OMP END TASKLOOP
!$OMP CRITICAL
C = C - A * B
!WARNING: OpenMP directive 'master' has been deprecated, please use 'masked' instead.
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
!$OMP END CRITICAL
!$OMP ORDERED
C = C - A * B
!WARNING: OpenMP directive 'master' has been deprecated, please use 'masked' instead.
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
!$OMP END ORDERED
!$OMP TASK
C = C - A * B
!WARNING: OpenMP directive 'master' has been deprecated, please use 'masked' instead.
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
!$OMP END TASK
!$OMP TASKLOOP
DO J= 1,N
C = C - A * B
!WARNING: OpenMP directive 'master' has been deprecated, please use 'masked' instead.
!ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
!$OMP MASTER
DO I = 1,N
!ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region.
!$OMP ORDERED
CALL WORK(I)
!$OMP END ORDERED
END DO
!$OMP END MASTER
END DO
!$OMP END TASKLOOP
END SUBROUTINE ORDERED_BAD