1module m 2 use iso_c_binding, only: c_loc 3 implicit none (type, external) 4 integer :: v 5 interface 6 subroutine foo (); end 7 integer function omp_get_thread_num (); end 8 integer function omp_get_num_threads (); end 9 integer function omp_get_cancellation (); end 10 integer(c_int) function omp_target_is_present(ptr, device_num) bind(c) 11 use, intrinsic :: iso_c_binding, only : c_ptr, c_int 12 type(c_ptr), value :: ptr 13 integer(c_int), value :: device_num 14 end 15 end interface 16 17contains 18subroutine f1(a) 19 integer :: a(0:) 20 integer :: i, j 21 !$omp simd order(concurrent) 22 do i = 0, 63 23 !$omp loop 24 do j = 0, 63 25 a(64 * i + j) = i + j 26 end do 27 end do 28end 29 30subroutine f2 (a) 31 integer :: a(0:) 32 integer :: i, j 33 !$omp do simd order(concurrent) 34 do i = 0, 63 35 !$omp loop 36 do j = 0, 63 37 a(64 * i + j) = i + j 38 end do 39 end do 40end 41 42subroutine f3 (a) 43 integer :: a(0:) 44 integer :: i, j 45 !$omp do order(concurrent) 46 do i = 0, 63 47 !$omp loop 48 do j = 0, 63 49 a(64 * i + j) = i + j 50 end do 51 end do 52end 53 54subroutine f4 (a) 55 integer, target :: a(0:) 56 integer :: i, j 57 !$omp loop order(concurrent) bind(parallel) 58 do i = 0, 63 59 !$omp parallel 60 call foo () 61 !$omp end parallel 62 end do 63 !$omp loop order(concurrent) bind(parallel) 64 do i = 0, 63 65 !$omp simd 66 do j = 0, 63 67 a(64 * i + j) = i + j 68 end do 69 end do 70 !$omp loop order(concurrent) bind(parallel) 71 do i = 0, 63 72 !$omp loop 73 do j = 0, 63 74 a(64 * i + j) = i + j 75 end do 76 end do 77 !$omp loop order(concurrent) bind(parallel) 78 do i = 0, 63 79 !$omp critical ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 80 call foo () 81 !$omp end critical 82 end do 83 !$omp loop order(concurrent) bind(parallel) 84 do i = 0, 63 85 !$omp ordered simd ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 86 call foo () 87 !$omp end ordered 88 end do 89 !$omp loop order(concurrent) bind(parallel) 90 do i = 0, 63 91 !$omp atomic ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 92 v = v + 1 93 end do 94 !$omp loop order(concurrent) bind(parallel) 95 do i = 0, 63 96 !$omp atomic read ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 97 a(i) = v 98 end do 99 !$omp loop order(concurrent) bind(parallel) 100 do i = 0, 63 101 !$omp atomic write ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 102 v = a(i) 103 end do 104 !$omp loop order(concurrent) bind(parallel) 105 do i = 0, 63 106 a(i) = a(i) + omp_get_thread_num () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 107 end do 108 !$omp loop order(concurrent) bind(parallel) 109 do i = 0, 63 110 a(i) = a(i) + omp_get_num_threads () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 111 end do 112 !$omp loop order(concurrent) bind(parallel) 113 do i = 0, 63 114 a(i) = a(i) + omp_target_is_present (c_loc (a(i)), 0) ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 115 end do 116 !$omp loop order(concurrent) bind(parallel) 117 do i = 0, 63 118 a(i) = a(i) + omp_get_cancellation () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 119 end do 120end 121 122subroutine f5 (a) 123 integer, target :: a(0:) 124 integer :: i, j 125 !$omp parallel 126 !$omp loop 127 do i = 0, 63 128 !$omp parallel 129 call foo () 130 !$omp end parallel 131 end do 132 !$omp loop 133 do i = 0, 63 134 !$omp simd 135 do j = 0, 63 136 a(64 * i + j) = i + j 137 end do 138 end do 139 !$omp loop 140 do i = 0, 63 141 !$omp loop 142 do j = 0, 63 143 a(64 * i + j) = i + j 144 end do 145 end do 146 !$omp loop 147 do i = 0, 63 148 !$omp critical ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 149 call foo () 150 !$omp end critical 151 end do 152 !$omp loop 153 do i = 0, 63 154 !$omp ordered simd ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 155 call foo () 156 !$omp end ordered 157 end do 158 !$omp loop 159 do i = 0, 63 160 !$omp atomic ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 161 v = v + 1 162 end do 163 !$omp loop 164 do i = 0, 63 165 !$omp atomic read ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 166 a(i) = v 167 end do 168 !$omp loop 169 do i = 0, 63 170 !$omp atomic write ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 171 v = a(i) 172 end do 173 !$omp loop 174 do i = 0, 63 175 !$omp master ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 176 call foo () 177 !$omp end master 178 end do 179 !$omp loop 180 do i = 0, 63 181 !$omp masked ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 182 call foo () 183 !$omp end masked 184 end do 185 !$omp loop 186 do i = 0, 63 187 !$omp scope ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 188 call foo () 189 !$omp end scope 190 end do 191 !$omp loop 192 do i = 0, 63 193 a(i) = a(i) + omp_get_thread_num () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 194 end do 195 !$omp loop 196 do i = 0, 63 197 a(i) = a(i) + omp_get_num_threads () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 198 end do 199 !$omp loop 200 do i = 0, 63 201 a(i) = a(i) + omp_target_is_present (c_loc(a(i)), 0) ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 202 end do 203 !$omp loop 204 do i = 0, 63 205 a(i) = a(i) + omp_get_cancellation () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 206 end do 207 !$omp end parallel 208end 209 210subroutine f6 (a) 211 integer, target :: a(0:) 212 integer :: i, j 213 !$omp master 214 !$omp loop 215 do i = 0, 63 216 !$omp parallel 217 call foo () 218 !$omp end parallel 219 end do 220 !$omp loop 221 do i = 0, 63 222 !$omp simd 223 do j = 0, 63 224 a(64 * i + j) = i + j 225 end do 226 end do 227 !$omp loop 228 do i = 0, 63 229 !$omp loop 230 do j = 0, 63 231 a(64 * i + j) = i + j 232 end do 233 end do 234 !$omp loop 235 do i = 0, 63 236 !$omp critical ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 237 call foo () 238 !$omp end critical 239 end do 240 !$omp loop 241 do i = 0, 63 242 !$omp ordered simd ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 243 call foo () 244 !$omp end ordered 245 end do 246 !$omp loop 247 do i = 0, 63 248 !$omp atomic ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 249 v = v + 1 250 end do 251 !$omp loop 252 do i = 0, 63 253 !$omp atomic read ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 254 a(i) = v 255 end do 256 !$omp loop 257 do i = 0, 63 258 !$omp atomic write ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } 259 v = a(i) 260 end do 261 !$omp loop 262 do i = 0, 63 263 a(i) = a(i) + omp_get_thread_num () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 264 end do 265 !$omp loop 266 do i = 0, 63 267 a(i) = a(i) + omp_get_num_threads () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 268 end do 269 !$omp loop 270 do i = 0, 63 271 a(i) = a(i) + omp_target_is_present (c_loc(a(i)), 0) ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 272 end do 273 !$omp loop 274 do i = 0, 63 275 a(i) = a(i) + omp_get_cancellation () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } 276 end do 277 !$omp end master 278end 279end module 280