1! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp 2use omp_lib 3! Check OpenMP clause validity for the following directives: 4! 5! 2.5 PARALLEL construct 6! 2.7.1 Loop construct 7! ... 8 9 integer :: b = 128 10 integer :: z, c = 32 11 integer, parameter :: num = 16 12 real(8) :: arrayA(256), arrayB(512) 13 14 integer(omp_memspace_handle_kind) :: xy_memspace = omp_default_mem_space 15 type(omp_alloctrait) :: xy_traits(1) = [omp_alloctrait(omp_atk_alignment,64)] 16 integer(omp_allocator_handle_kind) :: xy_alloc 17 xy_alloc = omp_init_allocator(xy_memspace, 1, xy_traits) 18 19 arrayA = 1.414 20 arrayB = 3.14 21 N = 1024 22 23! 2.5 parallel-clause -> if-clause | 24! num-threads-clause | 25! default-clause | 26! private-clause | 27! firstprivate-clause | 28! shared-clause | 29! copyin-clause | 30! reduction-clause | 31! proc-bind-clause | 32! allocate-clause 33 34 !$omp parallel 35 do i = 1, N 36 a = 3.14 37 enddo 38 !$omp end parallel 39 40 !$omp parallel private(b) allocate(b) 41 do i = 1, N 42 a = 3.14 43 enddo 44 !$omp end parallel 45 46 !$omp parallel private(c, b) allocate(omp_default_mem_space : b, c) 47 do i = 1, N 48 a = 3.14 49 enddo 50 !$omp end parallel 51 52 !$omp parallel allocate(b) allocate(c) private(b, c) 53 do i = 1, N 54 a = 3.14 55 enddo 56 !$omp end parallel 57 58 !$omp parallel allocate(xy_alloc :b) private(b) 59 do i = 1, N 60 a = 3.14 61 enddo 62 !$omp end parallel 63 64 !$omp task private(b) allocate(b) 65 do i = 1, N 66 z = 2 67 end do 68 !$omp end task 69 70 !$omp teams private(b) allocate(b) 71 do i = 1, N 72 z = 2 73 end do 74 !$omp end teams 75 76 !$omp target private(b) allocate(b) 77 do i = 1, N 78 z = 2 79 end do 80 !$omp end target 81 82 !ERROR: ALLOCATE clause is not allowed on the TARGET DATA directive 83 !$omp target data map(from: b) allocate(b) 84 do i = 1, N 85 z = 2 86 enddo 87 !$omp end target data 88 89 !ERROR: SCHEDULE clause is not allowed on the PARALLEL directive 90 !$omp parallel schedule(static) 91 do i = 1, N 92 a = 3.14 93 enddo 94 !$omp end parallel 95 96 !ERROR: COLLAPSE clause is not allowed on the PARALLEL directive 97 !$omp parallel collapse(2) 98 do i = 1, N 99 do j = 1, N 100 a = 3.14 101 enddo 102 enddo 103 !$omp end parallel 104 105 !ERROR: The parameter of the COLLAPSE clause must be a constant positive integer expression 106 !$omp do collapse(-1) 107 do i = 1, N 108 do j = 1, N 109 a = 3.14 110 enddo 111 enddo 112 !$omp end do 113 114 a = 1.0 115 !$omp parallel firstprivate(a) 116 do i = 1, N 117 a = 3.14 118 enddo 119 !ERROR: NUM_THREADS clause is not allowed on the END PARALLEL directive 120 !$omp end parallel num_threads(4) 121 122 !ERROR: LASTPRIVATE clause is not allowed on the PARALLEL directive 123 !ERROR: NUM_TASKS clause is not allowed on the PARALLEL directive 124 !ERROR: INBRANCH clause is not allowed on the PARALLEL directive 125 !$omp parallel lastprivate(a) NUM_TASKS(4) inbranch 126 do i = 1, N 127 a = 3.14 128 enddo 129 !$omp end parallel 130 131 !ERROR: At most one NUM_THREADS clause can appear on the PARALLEL directive 132 !$omp parallel num_threads(2) num_threads(4) 133 do i = 1, N 134 a = 3.14 135 enddo 136 !$omp end parallel 137 138 !ERROR: The parameter of the NUM_THREADS clause must be a positive integer expression 139 !$omp parallel num_threads(1-4) 140 do i = 1, N 141 a = 3.14 142 enddo 143 !ERROR: NOWAIT clause is not allowed on the END PARALLEL directive 144 !$omp end parallel nowait 145 146 !$omp parallel num_threads(num-10) 147 do i = 1, N 148 a = 3.14 149 enddo 150 !$omp end parallel 151 152 !$omp parallel num_threads(b+1) 153 do i = 1, N 154 a = 3.14 155 enddo 156 !$omp end parallel 157 158 !$omp parallel 159 do i = 1, N 160 enddo 161 !ERROR: Unmatched END TARGET directive 162 !$omp end target 163 164 ! OMP 5.0 - 2.6 Restriction point 1 165 outofparallel: do k =1, 10 166 !$omp parallel 167 !$omp do 168 outer: do i=0, 10 169 inner: do j=1, 10 170 exit 171 exit outer 172 !ERROR: EXIT to construct 'outofparallel' outside of PARALLEL construct is not allowed 173 !ERROR: EXIT to construct 'outofparallel' outside of DO construct is not allowed 174 exit outofparallel 175 end do inner 176 end do outer 177 !$omp end do 178 !$omp end parallel 179 end do outofparallel 180 181! 2.7.1 do-clause -> private-clause | 182! firstprivate-clause | 183! lastprivate-clause | 184! linear-clause | 185! reduction-clause | 186! schedule-clause | 187! collapse-clause | 188! ordered-clause 189 190 !ERROR: When SCHEDULE clause has AUTO specified, it must not have chunk size specified 191 !ERROR: At most one SCHEDULE clause can appear on the DO directive 192 !ERROR: When SCHEDULE clause has RUNTIME specified, it must not have chunk size specified 193 !$omp do schedule(auto, 2) schedule(runtime, 2) 194 do i = 1, N 195 a = 3.14 196 enddo 197 198 !ERROR: A modifier may not be specified in a LINEAR clause on the DO directive 199 !$omp do linear(ref(b)) 200 do i = 1, N 201 a = 3.14 202 enddo 203 204 !ERROR: The NONMONOTONIC modifier can only be specified with SCHEDULE(DYNAMIC) or SCHEDULE(GUIDED) 205 !ERROR: The NONMONOTONIC modifier cannot be specified if an ORDERED clause is specified 206 !$omp do schedule(NONMONOTONIC:static) ordered 207 do i = 1, N 208 a = 3.14 209 enddo 210 211 !$omp do schedule(simd, monotonic:dynamic) 212 do i = 1, N 213 a = 3.14 214 enddo 215 216 !ERROR: Clause LINEAR is not allowed if clause ORDERED appears on the DO directive 217 !ERROR: The parameter of the ORDERED clause must be a constant positive integer expression 218 !$omp do ordered(1-1) private(b) linear(b) linear(a) 219 do i = 1, N 220 a = 3.14 221 enddo 222 223 !ERROR: The parameter of the ORDERED clause must be greater than or equal to the parameter of the COLLAPSE clause 224 !$omp do collapse(num-14) ordered(1) 225 do i = 1, N 226 do j = 1, N 227 do k = 1, N 228 a = 3.14 229 enddo 230 enddo 231 enddo 232 233 !$omp parallel do simd if(parallel:a>1.) 234 do i = 1, N 235 enddo 236 !$omp end parallel do simd 237 238 !ERROR: Unmatched directive name modifier TARGET on the IF clause 239 !$omp parallel do if(target:a>1.) 240 do i = 1, N 241 enddo 242 !ERROR: Unmatched END SIMD directive 243 !$omp end simd 244 245! 2.7.2 sections-clause -> private-clause | 246! firstprivate-clause | 247! lastprivate-clause | 248! reduction-clause 249 250 !$omp parallel 251 !$omp sections 252 !$omp section 253 a = 0.0 254 !$omp section 255 b = 1 256 !$omp end sections nowait 257 !$omp end parallel 258 259 !$omp parallel 260 !$omp sections 261 !$omp section 262 a = 0.0 263 !ERROR: Unmatched END PARALLEL SECTIONS directive 264 !$omp end parallel sections 265 !$omp end parallel 266 267 !$omp parallel 268 !$omp sections 269 a = 0.0 270 b = 1 271 !$omp section 272 c = 1 273 d = 2 274 !ERROR: NUM_THREADS clause is not allowed on the END SECTIONS directive 275 !$omp end sections num_threads(4) 276 277 !$omp parallel 278 !$omp sections 279 b = 1 280 !$omp section 281 c = 1 282 d = 2 283 !ERROR: At most one NOWAIT clause can appear on the END SECTIONS directive 284 !$omp end sections nowait nowait 285 !$omp end parallel 286 287 !$omp end parallel 288 289! 2.11.2 parallel-sections-clause -> parallel-clause | 290! sections-clause 291 292 !$omp parallel sections num_threads(4) private(b) lastprivate(d) 293 a = 0.0 294 !$omp section 295 b = 1 296 c = 2 297 !$omp section 298 d = 3 299 !$omp end parallel sections 300 301 !ERROR: At most one NUM_THREADS clause can appear on the PARALLEL SECTIONS directive 302 !$omp parallel sections num_threads(1) num_threads(4) 303 a = 0.0 304 !ERROR: Unmatched END SECTIONS directive 305 !$omp end sections 306 307 !$omp parallel sections 308 !ERROR: NOWAIT clause is not allowed on the END PARALLEL SECTIONS directive 309 !$omp end parallel sections nowait 310 311! 2.7.3 single-clause -> private-clause | 312! firstprivate-clause 313! end-single-clause -> copyprivate-clause | 314! nowait-clause 315 316 !$omp parallel 317 b = 1 318 !ERROR: LASTPRIVATE clause is not allowed on the SINGLE directive 319 !$omp single private(a) lastprivate(c) 320 a = 3.14 321 !ERROR: Clause NOWAIT is not allowed if clause COPYPRIVATE appears on the END SINGLE directive 322 !ERROR: COPYPRIVATE variable 'a' may not appear on a PRIVATE or FIRSTPRIVATE clause on a SINGLE construct 323 !ERROR: At most one NOWAIT clause can appear on the END SINGLE directive 324 !$omp end single copyprivate(a) nowait nowait 325 c = 2 326 !$omp end parallel 327 328! 2.7.4 workshare 329 330 !$omp parallel 331 !$omp workshare 332 a = 1.0 333 !$omp end workshare nowait 334 !ERROR: NUM_THREADS clause is not allowed on the WORKSHARE directive 335 !$omp workshare num_threads(4) 336 a = 1.0 337 !ERROR: COPYPRIVATE clause is not allowed on the END WORKSHARE directive 338 !$omp end workshare nowait copyprivate(a) 339 !$omp end parallel 340 341! 2.8.1 simd-clause -> safelen-clause | 342! simdlen-clause | 343! linear-clause | 344! aligned-clause | 345! private-clause | 346! lastprivate-clause | 347! reduction-clause | 348! collapse-clause 349 350 a = 0.0 351 !ERROR: TASK_REDUCTION clause is not allowed on the SIMD directive 352 !$omp simd private(b) reduction(+:a) task_reduction(+:a) 353 do i = 1, N 354 a = a + b + 3.14 355 enddo 356 357 !ERROR: At most one SAFELEN clause can appear on the SIMD directive 358 !$omp simd safelen(1) safelen(2) 359 do i = 1, N 360 a = 3.14 361 enddo 362 363 !ERROR: The parameter of the SIMDLEN clause must be a constant positive integer expression 364 !$omp simd simdlen(-1) 365 do i = 1, N 366 a = 3.14 367 enddo 368 369 !ERROR: The parameter of the ALIGNED clause must be a constant positive integer expression 370 !$omp simd aligned(b:-2) 371 do i = 1, N 372 a = 3.14 373 enddo 374 375 !$omp parallel 376 !ERROR: The parameter of the SIMDLEN clause must be less than or equal to the parameter of the SAFELEN clause 377 !$omp simd safelen(1+1) simdlen(1+2) 378 do i = 1, N 379 a = 3.14 380 enddo 381 !$omp end parallel 382 383! 2.11.1 parallel-do-clause -> parallel-clause | 384! do-clause 385 386 !ERROR: At most one PROC_BIND clause can appear on the PARALLEL DO directive 387 !ERROR: A modifier may not be specified in a LINEAR clause on the PARALLEL DO directive 388 !$omp parallel do proc_bind(master) proc_bind(close) linear(val(b)) 389 do i = 1, N 390 a = 3.14 391 enddo 392 393! 2.8.3 do-simd-clause -> do-clause | 394! simd-clause 395 396 !$omp parallel 397 !ERROR: No ORDERED clause with a parameter can be specified on the DO SIMD directive 398 !ERROR: NOGROUP clause is not allowed on the DO SIMD directive 399 !$omp do simd ordered(2) NOGROUP 400 do i = 1, N 401 do j = 1, N 402 a = 3.14 403 enddo 404 enddo 405 !$omp end parallel 406 407! 2.11.4 parallel-do-simd-clause -> parallel-clause | 408! do-simd-clause 409 410 !$omp parallel do simd collapse(2) safelen(2) & 411 !$omp & simdlen(1) private(c) firstprivate(a) proc_bind(spread) 412 do i = 1, N 413 do j = 1, N 414 a = 3.14 415 enddo 416 enddo 417 418! 2.9.2 taskloop -> TASKLOOP [taskloop-clause[ [,] taskloop-clause]...] 419! taskloop-clause -> if-clause | 420! shared-clause | 421! private-clause | 422! firstprivate-clause | 423! lastprivate-clause | 424! default-clause | 425! grainsize-clause | 426! num-tasks-clause | 427! collapse-clause | 428! final-clause | 429! priority-clause | 430! untied-clause | 431! mergeable-clause | 432! nogroup-clause 433 434 !$omp taskloop 435 do i = 1, N 436 a = 3.14 437 enddo 438 439 !ERROR: SCHEDULE clause is not allowed on the TASKLOOP directive 440 !$omp taskloop schedule(static) 441 do i = 1, N 442 a = 3.14 443 enddo 444 445 !ERROR: GRAINSIZE and NUM_TASKS clauses are mutually exclusive and may not appear on the same TASKLOOP directive 446 !$omp taskloop num_tasks(3) grainsize(2) 447 do i = 1,N 448 a = 3.14 449 enddo 450 451 !ERROR: At most one NUM_TASKS clause can appear on the TASKLOOP directive 452 !ERROR: TASK_REDUCTION clause is not allowed on the TASKLOOP directive 453 !$omp taskloop num_tasks(3) num_tasks(2) task_reduction(*:a) 454 do i = 1,N 455 a = 3.14 456 enddo 457 458! 2.13.1 master 459 460 !$omp parallel 461 !$omp master 462 a=3.14 463 !$omp end master 464 !$omp end parallel 465 466 !$omp parallel 467 !ERROR: NUM_THREADS clause is not allowed on the MASTER directive 468 !$omp master num_threads(4) 469 a=3.14 470 !$omp end master 471 !$omp end parallel 472 473! Standalone Directives (basic) 474 475 !$omp taskyield 476 !$omp barrier 477 !$omp taskwait 478 !$omp taskwait depend(source) 479 ! !$omp taskwait depend(sink:i-1) 480 ! !$omp target enter data map(to:arrayA) map(alloc:arrayB) 481 ! !$omp target update from(arrayA) to(arrayB) 482 ! !$omp target exit data map(from:arrayA) map(delete:arrayB) 483 !$omp flush (c) 484 !$omp flush acq_rel 485 !$omp flush release 486 !$omp flush acquire 487 !ERROR: If memory-order-clause is RELEASE, ACQUIRE, or ACQ_REL, list items must not be specified on the FLUSH directive 488 !$omp flush release (c) 489 !ERROR: SEQ_CST clause is not allowed on the FLUSH directive 490 !$omp flush seq_cst 491 !ERROR: RELAXED clause is not allowed on the FLUSH directive 492 !$omp flush relaxed 493 494! 2.13.2 critical Construct 495 496 ! !$omp critical (first) 497 a = 3.14 498 ! !$omp end critical (first) 499 500! 2.9.1 task-clause -> if-clause | 501! final-clause | 502! untied-clause | 503! default-clause | 504! mergeable-clause | 505! private-clause | 506! firstprivate-clause | 507! shared-clause | 508! depend-clause | 509! priority-clause 510 511 !$omp task shared(a) default(none) if(task:a > 1.) 512 a = 1. 513 !$omp end task 514 515 !ERROR: Unmatched directive name modifier TASKLOOP on the IF clause 516 !$omp task private(a) if(taskloop:a.eq.1) 517 a = 1. 518 !$omp end task 519 520 !ERROR: LASTPRIVATE clause is not allowed on the TASK directive 521 !ERROR: At most one FINAL clause can appear on the TASK directive 522 !$omp task lastprivate(b) final(a.GE.1) final(.false.) 523 b = 1 524 !$omp end task 525 526 !ERROR: The parameter of the PRIORITY clause must be a positive integer expression 527 !$omp task priority(-1) firstprivate(a) mergeable 528 a = 3.14 529 !$omp end task 530 531! 2.9.3 taskloop-simd-clause -> taskloop-clause | 532! simd-clause 533 534 !$omp taskloop simd 535 do i = 1, N 536 a = 3.14 537 enddo 538 !$omp end taskloop simd 539 540 !$omp taskloop simd reduction(+:a) 541 do i = 1, N 542 a = a + 3.14 543 enddo 544 !ERROR: Unmatched END TASKLOOP directive 545 !$omp end taskloop 546 547 !ERROR: GRAINSIZE and NUM_TASKS clauses are mutually exclusive and may not appear on the same TASKLOOP SIMD directive 548 !$omp taskloop simd num_tasks(3) grainsize(2) 549 do i = 1,N 550 a = 3.14 551 enddo 552 553 !ERROR: The parameter of the SIMDLEN clause must be a constant positive integer expression 554 !ERROR: The parameter of the ALIGNED clause must be a constant positive integer expression 555 !$omp taskloop simd simdlen(-1) aligned(a:-2) 556 do i = 1, N 557 a = 3.14 558 enddo 559 560 !$omp target enter data map(alloc:A) device(0) 561 !$omp target exit data map(delete:A) device(0) 562 563end program 564