Break circular dependency between FIR dialect and utilities
[llvm-project.git] / flang / test / Semantics / OpenMP / workshare04.f90
blob0ec635e52d2b73ccc746d475272175bbe8a255cd
1 ! RUN: %python %S/../test_errors.py %s %flang -fopenmp
2 ! OpenMP Version 4.5
3 ! 2.7.4 workshare Construct
4 ! Checks for OpenMP Workshare construct
6 subroutine omp_workshare(aa, bb, cc, dd, ee, ff, n)
7 integer i, j, n, a(10), b(10)
8 integer, pointer :: p
9 integer, target :: t
10 real aa(n,n), bb(n,n), cc(n,n), dd(n,n), ee(n,n), ff(n,n)
12 !ERROR: The structured block in a WORKSHARE construct may consist of only SCALAR or ARRAY assignments, FORALL or WHERE statements, FORALL, WHERE, ATOMIC, CRITICAL or PARALLEL constructs
13 !$omp workshare
14 p => t
16 !$omp parallel
17 cc = dd
18 !$omp end parallel
20 !ERROR: OpenMP constructs enclosed in WORKSHARE construct may consist of ATOMIC, CRITICAL or PARALLEL constructs only
21 !ERROR: A worksharing region may not be closely nested inside a worksharing, explicit task, taskloop, critical, ordered, atomic, or master region
22 !$omp parallel workshare
23 !ERROR: A worksharing region may not be closely nested inside a worksharing, explicit task, taskloop, critical, ordered, atomic, or master region
24 !$omp single
25 ee = ff
26 !$omp end single
27 !$omp end parallel workshare
29 where (aa .ne. 0) cc = bb / aa
31 where (b .lt. 2) b = sum(a)
33 where (aa .ge. 2.0)
34 cc = aa + bb
35 elsewhere
36 cc = dd + ee
37 end where
39 forall (i = 1:10, n > i) a(i) = b(i)
41 forall (j = 1:10)
42 a(j) = a(j) + b(j)
43 end forall
45 !$omp atomic update
46 j = j + sum(a)
48 !$omp end workshare
50 end subroutine omp_workshare