1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
! 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
|