3 extern "C" void abort ();
23 #pragma omp declare reduction (foo : U<0>, S : omp_out.foo (omp_in, false))
24 #pragma omp declare reduction (foo : int : omp_out += omp_in) \
25 initializer (omp_priv = N + 2)
26 #pragma omp declare reduction (foo : double : omp_out += omp_in) \
27 initializer (dblinit (&omp_priv))
32 if (s.s != 6 || v != 0) abort ();
35 #pragma omp parallel num_threads (4) reduction (foo : s, v, d) \
36 reduction (::NS::U<N>::operator + : q)
38 if (s.s != 6 || q != 0 || v != N + 2 || d != 2.0) abort ();
39 asm volatile ("" : "+m" (s.s), "+r" (q), "+r" (v));
42 if (s.s != 20 + q * 7 || (N + 3) * q != v || d != 4.0 + 2.0 * q)
45 void foo (S &x) { s += x.s; }
46 void foo (S &x, bool y) { s += x.s; if (y) abort (); }
47 S (const S &x) { s = x.s + 1; }
48 S (const S &x, bool y) { s = x.s + 2; if (y) abort (); }
53 #pragma omp declare reduction (bar : S<1> : omp_out.foo (omp_in)) \
54 initializer (omp_priv (8))
62 /* Ensure the above store is not DSEd. */
63 asm volatile ("" : : "r" (&s) : "memory");
67 struct T : public NS::S<N>
73 if (s.s != 6) abort ();
74 #pragma omp parallel num_threads (4) reduction (foo:s) \
77 if (s.s != 6 || q != 0) abort ();
78 asm volatile ("" : "+m" (s.s), "+r" (q));
81 if (s.s != 6 + q * 8) abort ();
92 template <typename T, typename D>
95 #pragma omp declare reduction (baz: T: omp_out.s += omp_in.s) \
96 initializer (omp_priv (11))
97 #pragma omp declare reduction (baz: D: omp_out += omp_in) \
98 initializer (dblinit (&omp_priv))
99 static void dblinit (D *x) { *x = 3.0; }
106 if (t.s != 6 || v.v != 4) abort ();
107 #pragma omp declare reduction (+ : V, W : omp_out.v -= omp_in.v) \
108 initializer (omp_priv (12))
110 #pragma omp declare reduction (+ : W, V : omp_out.v += omp_in.v) \
111 initializer (omp_priv (9))
112 #pragma omp parallel num_threads (4) reduction (+: v, q) \
113 reduction (baz: t, d)
115 if (t.s != 11 || v.v != 9 || q != 0 || d != 3.0) abort ();
116 asm volatile ("" : "+m" (t.s), "+m" (v.v), "+r" (q));
117 t.s += 2; v.v += 3; q++;
119 if (t.s != 6 + 13 * q || v.v != 4 + 12 * q || d != 4.0 + 3.0 * q)
138 if (s.s != 6) abort ();
140 #pragma omp parallel num_threads (4) reduction (bar:s) reduction (+:q)
142 if (s.s != 8 || q != 0) abort ();
143 asm volatile ("" : "+m" (s.s), "+r" (q));
146 if (s.s != 6 + q * 12) abort ();
147 V <NS::S <0>, double> v;