| // { dg-do run } |
| |
| extern "C" void abort (); |
| |
| struct S |
| { |
| int s; |
| void foo (S &x) { s += x.s; } |
| S (const S &x) { s = x.s + 1; } |
| S () { s = 6; } |
| ~S () {} |
| }; |
| |
| void |
| bar (S &x, S &y) |
| { |
| if (x.s != 6 || y.s != 6) |
| abort (); |
| x.s = 8; |
| } |
| |
| #pragma omp declare reduction (foo: S: omp_out.foo (omp_in)) \ |
| initializer (omp_priv (omp_orig)) |
| #pragma omp declare reduction (bar : S: omp_out.foo (omp_in)) \ |
| initializer (bar (omp_priv, omp_orig)) |
| |
| S |
| baz (S x) |
| { |
| S r; |
| int i = 0; |
| if (x.s != 7 || r.s != 6) |
| abort (); |
| #pragma omp parallel reduction (foo: x) reduction (bar: r) \ |
| reduction (+: i) |
| { |
| if (x.s != 8 || r.s != 8) |
| abort (); |
| x.s = 12; |
| r.s = 14; |
| i = 1; |
| } |
| if (x.s != 7 + 12 * i || r.s != 6 + 14 * i) |
| abort (); |
| return r; |
| } |
| |
| void |
| baz (S &x, S &y) |
| { |
| int i = 0, &j = i; |
| #pragma omp parallel reduction (foo: x) reduction (bar: y) \ |
| reduction (+: i) |
| { |
| if (x.s != 7 || y.s != 8) |
| abort (); |
| x.s = 12; |
| y.s = 14; |
| i = 1; |
| } |
| if (x.s != 6 + 12 * j || y.s != 6 + 14 * j) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| S s; |
| baz (s); |
| S t, u; |
| baz (t, u); |
| } |