1 // { dg-do run } 2 3 extern "C" void abort (); 4 5 struct S 6 { fooS7 void foo () 8 { 9 S s; 10 int j = 0; 11 #pragma omp declare reduction (bar : int : omp_out += omp_in) 12 #pragma omp parallel reduction (bar : s) reduction(S::operator+ : j) 13 s.a = 4, j = 1; 14 if (s.a != 4 * j) abort (); 15 } 16 #pragma omp declare reduction (bar : S : baz (omp_out, omp_in)) bazS17 static void baz (S &x, S &y) { x.a += y.a; } SS18 S () : a (0) {} 19 int a; 20 }; 21 22 template <int N> 23 struct T 24 { fooT25 void foo () 26 { 27 S s; 28 T t; 29 int j = 0; 30 #pragma omp declare reduction (bar : int : omp_out += omp_in) 31 #pragma omp parallel reduction (bar : t) reduction (S::bar : s) \ 32 reduction(T<N>::operator+ : j) 33 s.a = 4, t.a = 5, j = 1; 34 if (s.a != 4 * j || t.a != 5 * j) abort (); 35 } 36 #pragma omp declare reduction (bar : T<N> : baz (omp_out, omp_in)) bazT37 static void baz (T &x, T &y) { x.a += y.a; } TT38 T () : a (N) {} 39 int a; 40 }; 41 42 int main()43main () 44 { 45 S s; 46 s.foo (); 47 T<0> t; 48 t.foo (); 49 } 50