1! { dg-do compile }
2! { dg-additional-options "-fdump-tree-original" }
3!
4! (in_)reduction clause
5! Test all in-principle valid combinations, even if
6! not valid in this context (some fail at ME level)
7!
8implicit none
9integer :: a, b, i
10a = 0
11
12! ------------ parallel ------------
13!$omp parallel reduction(+:a)
14do i=1,10
15  a = a + 1
16end do
17!$omp end parallel
18
19!$omp parallel reduction(default,+:a)
20do i=1,10
21  a = a + 1
22end do
23!$omp end parallel
24
25!$omp parallel reduction(task,+:a)
26do i=1,10
27  a = a + 1
28end do
29!$omp end parallel
30
31
32! ------------ simd ------------
33!$omp simd reduction(+:a)
34do i=1,10
35  a = a + 1
36end do
37
38!$omp simd reduction(default,+:a)
39do i=1,10
40  a = a + 1
41end do
42
43!$omp simd reduction(task,+:a)  ! { dg-error "invalid 'task' reduction modifier on construct other than 'parallel', 'do', 'sections' or 'scope'" }
44do i=1,10
45  a = a + 1
46end do
47
48! ------------ do ------------
49!$omp parallel
50!$omp do reduction(+:a)
51do i=1,10
52  a = a + 1
53end do
54!$omp end parallel
55
56!$omp parallel
57!$omp do reduction(default,+:a)
58do i=1,10
59  a = a + 1
60end do
61!$omp end parallel
62
63!$omp parallel
64!$omp do reduction(task,+:a)
65do i=1,10
66  a = a + 1
67end do
68!$omp end parallel
69
70! ------------ section ------------
71!$omp parallel
72!$omp sections reduction(+:a)
73  !$omp section
74  a = a + 1
75!$omp end sections
76!$omp end parallel
77
78!$omp parallel
79!$omp sections reduction(default,+:a)
80  !$omp section
81  a = a + 1
82!$omp end sections
83!$omp end parallel
84
85!$omp parallel
86!$omp sections reduction(task,+:a)
87  !$omp section
88  a = a + 1
89!$omp end sections
90!$omp end parallel
91
92! ------------ task ------------
93!$omp task in_reduction(+:a)
94  a = a + 1
95!$omp end task
96
97! ------------ taskloop ------------
98!$omp taskloop reduction(+:a) in_reduction(+:b)
99do i=1,10
100  a = a + 1
101end do
102
103!$omp taskloop reduction(default,+:a) in_reduction(+:b)
104do i=1,10
105  a = a + 1
106end do
107
108! ------------ target ------------
109!$omp target in_reduction(+:b)
110  a = a + 1
111!$omp end target
112
113! ------------ teams ------------
114!$omp teams reduction(+:b)
115  a = a + 1
116!$omp end teams
117
118!$omp teams reduction(default, +:b)
119  a = a + 1
120!$omp end teams
121
122! ------------ taskgroup --------
123
124!$omp taskgroup task_reduction(+:b)
125  a = a + 1
126!$omp end taskgroup
127
128end
129
130! { dg-final { scan-tree-dump-times "#pragma omp for reduction\\(\\\+:a\\)" 2 "original" } }
131! { dg-final { scan-tree-dump-times "#pragma omp for reduction\\(task,\\\+:a\\)" 1 "original" } }
132! { dg-final { scan-tree-dump-times "#pragma omp parallel\[\n\r\]" 6 "original" } }
133! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(i\\) reduction\\(\\\+:a\\)" 2 "original" } }
134! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(i\\) reduction\\(task,\\\+:a\\)" 1 "original" } }
135! { dg-final { scan-tree-dump-times "#pragma omp section\[\n\r\]" 3 "original" } }
136! { dg-final { scan-tree-dump-times "#pragma omp sections reduction\\(\\\+:a\\)" 2 "original" } }
137! { dg-final { scan-tree-dump-times "#pragma omp sections reduction\\(task,\\\+:a\\)" 1 "original" } }
138! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) reduction\\(\\\+:a\\)" 2 "original" } }
139! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) reduction\\(task,\\\+:a\\)" 1 "original" } }
140! { dg-final { scan-tree-dump-times "#pragma omp target map\\(always,tofrom:b\\) in_reduction\\(\\\+:b\\)" 1 "original" } }
141! { dg-final { scan-tree-dump-times "#pragma omp task in_reduction\\(\\\+:a\\)" 1 "original" } }
142! { dg-final { scan-tree-dump-times "#pragma omp teams reduction\\(\\\+:b\\)" 2 "original" } }
143! { dg-final { scan-tree-dump-times "#pragma omp taskloop reduction\\(\\\+:a\\) in_reduction\\(\\\+:b\\)" 2 "original" } }
144