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()43 main ()
44 {
45   S s;
46   s.foo ();
47   T<0> t;
48   t.foo ();
49 }
50