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 149
  
     | 
    
      ! RUN: %S/test_errors.sh %s %t %flang -fopenmp
! REQUIRES: shell
! 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: The ORDERED clause must be present on the loop construct if any ORDERED region ever binds to a loop region arising from the loop construct.
      !$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: The ORDERED clause must be present on the loop construct if any ORDERED region ever binds to a loop region arising from the loop construct.
      !$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
 
     |