extern #ifdef __cplusplus "C" #endif void abort (void); void bar (long long int *p) { p[0] *= 2; #pragma omp task in_reduction (*: p[0]) p[0] *= 3; } void foo (long long int *p, long long int *q) { #pragma omp taskgroup task_reduction (*: p[0]) { #pragma omp task in_reduction (*: p[0]) bar (p); #pragma omp task in_reduction (*: p[0]) bar (p); bar (p); #pragma omp taskgroup task_reduction (*: q[0]) { #pragma omp task in_reduction (*: q[0]) bar (q); #pragma omp task in_reduction (*: q[0]) bar (q); #pragma omp task in_reduction (*: q[0]) bar (q); bar (q); #pragma omp task in_reduction (*: p[0]) { #pragma omp taskgroup task_reduction (*: p[0]) { #pragma omp task in_reduction (*: p[0]) bar (p); p[0] *= 2; #pragma omp task in_reduction (*: p[0]) bar (p); } } } } } int main () { long long int p = 1LL, q = 1LL; foo (&p, &q); if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL) abort (); p = 1LL; q = 1LL; #pragma omp taskgroup foo (&p, &q); if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL) abort (); p = 1LL; q = 1LL; #pragma omp parallel #pragma omp single foo (&p, &q); if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL) abort (); return 0; }