1 extern
2 #ifdef __cplusplus
3 "C"
4 #endif
5 void abort (void);
6 
7 void
bar(long long int * p)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
foo(long long int * p,long long int * q)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
main()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 }
71