1#include <stdlib.h>
2
3void
4dep (void)
5{
6  int x = 1;
7  #pragma omp parallel
8  #pragma omp single
9  {
10    #pragma omp task shared (x) depend(out: x)
11    x = 2;
12    #pragma omp task shared (x) depend(in: x)
13    if (x != 2)
14      abort ();
15  }
16}
17
18void
19dep2 (void)
20{
21  #pragma omp parallel
22  #pragma omp single
23  {
24    int x = 1;
25    #pragma omp task shared (x) depend(out: x)
26    x = 2;
27    #pragma omp task shared (x) depend(in: x)
28    if (x != 2)
29      abort ();
30    #pragma omp taskwait
31  }
32}
33
34void
35dep3 (void)
36{
37  #pragma omp parallel
38  {
39    int x = 1;
40    #pragma omp single
41    {
42      #pragma omp task shared (x) depend(out: x)
43      x = 2;
44      #pragma omp task shared (x) depend(in: x)
45      if (x != 2)
46	abort ();
47    }
48  }
49}
50
51void
52firstpriv (void)
53{
54  #pragma omp parallel
55  #pragma omp single
56  {
57    int x = 1;
58    #pragma omp task depend(out: x)
59    x = 2;
60    #pragma omp task depend(in: x)
61    if (x != 1)
62      abort ();
63  }
64}
65
66void
67antidep (void)
68{
69  int x = 1;
70  #pragma omp parallel
71  #pragma omp single
72  {
73    #pragma omp task shared(x) depend(in: x)
74    if (x != 1)
75      abort ();
76    #pragma omp task shared(x) depend(out: x)
77    x = 2;
78  }
79}
80
81void
82antidep2 (void)
83{
84  #pragma omp parallel
85  #pragma omp single
86  {
87    int x = 1;
88    #pragma omp taskgroup
89    {
90      #pragma omp task shared(x) depend(in: x)
91      if (x != 1)
92	abort ();
93      #pragma omp task shared(x) depend(out: x)
94      x = 2;
95    }
96  }
97}
98
99void
100antidep3 (void)
101{
102  #pragma omp parallel
103  {
104    int x = 1;
105    #pragma omp single
106    {
107      #pragma omp task shared(x) depend(in: x)
108      if (x != 1)
109	abort ();
110      #pragma omp task shared(x) depend(out: x)
111      x = 2;
112    }
113  }
114}
115
116
117void
118outdep (void)
119{
120  #pragma omp parallel
121  #pragma omp single
122  {
123    int x = 0;
124    #pragma omp task shared(x) depend(out: x)
125    x = 1;
126    #pragma omp task shared(x) depend(out: x)
127    x = 2;
128    #pragma omp taskwait
129    if (x != 2)
130      abort ();
131  }
132}
133
134void
135concurrent (void)
136{
137  int x = 1;
138  #pragma omp parallel
139  #pragma omp single
140  {
141    #pragma omp task shared (x) depend(out: x)
142    x = 2;
143    #pragma omp task shared (x) depend(in: x)
144    if (x != 2)
145      abort ();
146    #pragma omp task shared (x) depend(in: x)
147    if (x != 2)
148      abort ();
149    #pragma omp task shared (x) depend(in: x)
150    if (x != 2)
151      abort ();
152  }
153}
154
155void
156concurrent2 (void)
157{
158  #pragma omp parallel
159  #pragma omp single
160  {
161    int x = 1;
162    #pragma omp task shared (x) depend(out: x)
163    x = 2;
164    #pragma omp task shared (x) depend(in: x)
165    if (x != 2)
166      abort ();
167    #pragma omp task shared (x) depend(in: x)
168    if (x != 2)
169      abort ();
170    #pragma omp task shared (x) depend(in: x)
171    if (x != 2)
172      abort ();
173    #pragma omp taskwait
174  }
175}
176
177void
178concurrent3 (void)
179{
180  #pragma omp parallel
181  {
182    int x = 1;
183    #pragma omp single
184    {
185      #pragma omp task shared (x) depend(out: x)
186      x = 2;
187      #pragma omp task shared (x) depend(in: x)
188      if (x != 2)
189	abort ();
190      #pragma omp task shared (x) depend(in: x)
191      if (x != 2)
192	abort ();
193      #pragma omp task shared (x) depend(in: x)
194      if (x != 2)
195	abort ();
196    }
197  }
198}
199
200int
201main ()
202{
203  dep ();
204  dep2 ();
205  dep3 ();
206  firstpriv ();
207  antidep ();
208  antidep2 ();
209  antidep3 ();
210  outdep ();
211  concurrent ();
212  concurrent2 ();
213  concurrent3 ();
214  return 0;
215}
216