1 // { dg-do run } 2 3 extern "C" void abort (); 4 5 struct S 6 { 7 int s; fooS8 void foo (S &x) { s += x.s; } SS9 S (const S &x) { s = x.s + 1; } SS10 S () { s = 6; } ~SS11 ~S () {} 12 }; 13 14 void bar(S & x,S & y)15bar (S &x, S &y) 16 { 17 if (x.s != 6 || y.s != 6) 18 abort (); 19 x.s = 8; 20 } 21 22 #pragma omp declare reduction (foo: S: omp_out.foo (omp_in)) \ 23 initializer (omp_priv (omp_orig)) 24 #pragma omp declare reduction (bar : S: omp_out.foo (omp_in)) \ 25 initializer (bar (omp_priv, omp_orig)) 26 27 S baz(S x)28baz (S x) 29 { 30 S r; 31 int i = 0; 32 if (x.s != 7 || r.s != 6) 33 abort (); 34 #pragma omp parallel reduction (foo: x) reduction (bar: r) \ 35 reduction (+: i) 36 { 37 if (x.s != 8 || r.s != 8) 38 abort (); 39 x.s = 12; 40 r.s = 14; 41 i = 1; 42 } 43 if (x.s != 7 + 12 * i || r.s != 6 + 14 * i) 44 abort (); 45 return r; 46 } 47 48 void baz(S & x,S & y)49baz (S &x, S &y) 50 { 51 int i = 0, &j = i; 52 #pragma omp parallel reduction (foo: x) reduction (bar: y) \ 53 reduction (+: i) 54 { 55 if (x.s != 7 || y.s != 8) 56 abort (); 57 x.s = 12; 58 y.s = 14; 59 i = 1; 60 } 61 if (x.s != 6 + 12 * j || y.s != 6 + 14 * j) 62 abort (); 63 } 64 65 int main()66main () 67 { 68 S s; 69 baz (s); 70 S t, u; 71 baz (t, u); 72 } 73