! 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 !$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 !$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 !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 !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