| /* PR middle-end/101167 */ |
| |
| extern |
| #ifdef __cplusplus |
| "C" |
| #endif |
| void abort (void); |
| |
| struct S { int a, b, c[2]; }; |
| |
| void |
| init (struct S *x) |
| { |
| x->a = 0; |
| x->b = 0; |
| x->c[0] = 0; |
| x->c[1] = 0; |
| } |
| |
| void |
| merge (struct S *x, struct S *y) |
| { |
| x->a += y->a; |
| x->b += y->b; |
| } |
| |
| #pragma omp declare reduction (+: struct S : merge (&omp_out, &omp_in)) initializer (init (&omp_priv)) |
| |
| void |
| foo (struct S x) |
| { |
| #pragma omp taskgroup task_reduction (+: x) |
| { |
| #pragma omp task in_reduction (+: x) |
| { |
| x.a++; |
| x.b++; |
| } |
| #pragma omp task in_reduction (+: x) |
| { |
| x.a += 4; |
| x.b += 14; |
| } |
| #pragma omp task in_reduction (+: x) |
| { |
| x.a += 9; |
| x.b += 19; |
| } |
| } |
| if (x.a != 56 || x.b != 86) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| struct S x = { 42, 52 }; |
| #pragma omp parallel master num_threads(3) |
| foo (x); |
| return 0; |
| } |