1 extern
2 #ifdef __cplusplus
3 "C"
4 #endif
5 void abort (void);
6
7 void
8 bar (long long int *p)
9 {
10 p[0] *= 2;
11 #pragma omp task in_reduction (*: p[0])
12 p[0] *= 3;
13 }
14
15 void
16 foo (long long int *p, long long int *q)
17 {
18 #pragma omp taskgroup task_reduction (*: p[0])
19 {
20 #pragma omp task in_reduction (*: p[0])
21 bar (p);
22 #pragma omp task in_reduction (*: p[0])
23 bar (p);
24 bar (p);
25 #pragma omp taskgroup task_reduction (*: q[0])
26 {
27 #pragma omp task in_reduction (*: q[0])
28 bar (q);
29 #pragma omp task in_reduction (*: q[0])
30 bar (q);
31 #pragma omp task in_reduction (*: q[0])
32 bar (q);
33 bar (q);
34 #pragma omp task in_reduction (*: p[0])
35 {
36 #pragma omp taskgroup task_reduction (*: p[0])
37 {
38 #pragma omp task in_reduction (*: p[0])
39 bar (p);
40 p[0] *= 2;
41 #pragma omp task in_reduction (*: p[0])
42 bar (p);
43 }
44 }
45 }
46 }
47 }
48
49 int
50 main ()
51 {
52 long long int p = 1LL, q = 1LL;
53 foo (&p, &q);
54 if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
55 abort ();
56 p = 1LL;
57 q = 1LL;
58 #pragma omp taskgroup
59 foo (&p, &q);
60 if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
61 abort ();
62 p = 1LL;
63 q = 1LL;
64 #pragma omp parallel
65 #pragma omp single
66 foo (&p, &q);
67 if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
68 abort ();
69 return 0;
70 }