xref: /llvm-project/flang/test/Semantics/OpenMP/reduction07.f90 (revision 502bea25bdc07d1811b8bfea1c2e6bfa8617f72f)
1! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
2! OpenMP Version 4.5
3! 2.15.3.6 Reduction Clause
4program omp_reduction
5
6  integer :: a,i,j,l
7  integer :: k = 10
8  !$omp parallel private(k)
9  !ERROR: REDUCTION variable 'k' is PRIVATE in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
10  !$omp do reduction(+:k)
11  do i = 1, 10
12    k = k + 1
13  end do
14  !$omp end do
15  !$omp end parallel
16
17
18  !$omp parallel private(j),reduction(+:k)
19  !ERROR: REDUCTION variable 'k' is REDUCTION in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
20  !$omp do reduction(+:k)
21  do i = 1, 10
22    k = k + 1
23  end do
24  !$omp end do
25  !$omp end parallel
26
27  !$omp parallel private(j),firstprivate(k)
28  !ERROR: REDUCTION variable 'k' is FIRSTPRIVATE in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
29  !$omp do reduction(min:k)
30  do i = 1, 10
31    k = k + 1
32  end do
33  !$omp end do
34  !$omp end parallel
35
36
37  !$omp parallel private(l,j),firstprivate(k)
38  !ERROR: REDUCTION variable 'k' is FIRSTPRIVATE in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
39  !ERROR: REDUCTION variable 'j' is PRIVATE in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
40  !$omp sections reduction(ior:k) reduction(*:j)
41  do i = 1, 10
42    k = ior(k, 1)
43    j = j * 3
44  end do
45  !$omp end sections
46  !$omp end parallel
47
48!$omp sections private(k)
49  !ERROR: A worksharing region may not be closely nested inside a worksharing, explicit task, taskloop, critical, ordered, atomic, or master region
50  !ERROR: REDUCTION variable 'k' is PRIVATE in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
51  !$omp do reduction(+:k) reduction(max:j)
52  do i = 1, 10
53    k = k + 1
54  end do
55  !$omp end do
56!$omp end sections
57
58!$omp sections private(k)
59  !$omp target
60  do j = 1,10
61    !ERROR: A worksharing region may not be closely nested inside a worksharing, explicit task, taskloop, critical, ordered, atomic, or master region
62    !$omp do reduction(+:k) reduction(max:j)
63    do i = 1, 10
64      k = k + 1
65    end do
66    !$omp end do
67  end do
68  !$omp end target
69!$omp end sections
70
71!$omp parallel reduction(+:a)
72!ERROR: REDUCTION variable 'a' is REDUCTION in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
73!$omp sections reduction(*:a)
74a = a + 10
75!$omp end sections
76!$omp end parallel
77
78!$omp parallel reduction(*:a)
79!$omp end parallel
80
81!$omp parallel reduction(ieor:a)
82!ERROR: REDUCTION variable 'a' is REDUCTION in outer context must be shared in the parallel regions to which any of the worksharing regions arising from the worksharing construct bind.
83!$omp sections reduction(+:a)
84a = ieor(a, 10)
85!$omp end sections
86!$omp end parallel
87
88!$omp parallel private(a)
89!$omp parallel reduction(ieor:a)
90!$omp end parallel
91!$omp end parallel
92
93!$omp task firstprivate(a)
94!$omp parallel do reduction(+:a)
95do i=1,10
96  a=a+j
97end do
98!$omp end parallel do
99!$omp end task
100
101end program omp_reduction
102