#ifdef __cplusplus extern "C" #endif void abort (void); int a; long int b = 1; void foo (void) { int i; for (i = 0; i < 2; i++) #pragma omp task in_reduction (+: a) in_reduction (*: b) { a += 7; b *= 2; } } int main () { int c = 0; #pragma omp parallel #pragma omp single { long int d = 1; #pragma omp taskgroup task_reduction (+: a, c) task_reduction (*: b, d) { int i; for (i = 0; i < 4; i++) #pragma omp task in_reduction (+: a, c) in_reduction (*: b, d) { int j; a += 7; b *= 2; for (j = 0; j < 2; j++) #pragma omp task in_reduction (+: a, c) in_reduction (*: b, d) { a += 7; b *= 2; c += 9; d *= 3; foo (); } c += 9; d *= 3; } } #define THREEP4 (3L * 3L * 3L * 3L) if (d != (THREEP4 * THREEP4 * THREEP4)) abort (); } if (a != 28 * 7 || b != (1L << 28) || c != 12 * 9) abort (); return 0; }