xref: /llvm-project/flang/test/Semantics/OpenMP/workshare04.f90 (revision 87452bcb806c9a45b09dab7c2e6594a7ebb085a2)
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
5
6subroutine 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)
11
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
15
16  !$omp parallel
17  cc = dd
18  !$omp end parallel
19
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
28
29  where (aa .ne. 0) cc = bb / aa
30
31  where (b .lt. 2) b = sum(a)
32
33  where (aa .ge. 2.0)
34    cc = aa + bb
35  elsewhere
36    cc = dd + ee
37  end where
38
39  forall (i = 1:10, n > i) a(i) = b(i)
40
41  forall (j = 1:10)
42    a(j) = a(j) + b(j)
43  end forall
44
45  !$omp atomic update
46  j = j + sum(a)
47
48  !$omp end workshare
49
50end subroutine omp_workshare
51