6 struct R { R () {}; ~R () {}; int r; };
8 struct T { T () : t(d) {}; virtual ~T () {}; Q t; };
10 struct A : public R, virtual public T<Q> { A () : b(c), a(e) {} Q a; int &b; void m1 (); };
13 take (int &a, int &b, int &c, int &d)
15 asm volatile ("" : : "g" (&a), "g" (&b), "g" (&c), "g" (&d) : "memory");
22 #pragma omp parallel private (a, r, T<Q>::t, A::b)
24 int q = omp_get_thread_num ();
29 take (a, r, T<Q>::t, b);
31 if (A::a != q || R::r != 2 * q || T<Q>::t != 3 * q || A::b != 4 * q)
38 #pragma omp parallel firstprivate (A::a, R::r, T<Q>::t, b)
40 int q = omp_get_thread_num ();
41 take (A::a, R::r, T<Q>::t, A::b);
42 if (a != 7 || r != 8 || T<Q>::t != 9 || b != 10)
48 take (a, r, T<Q>::t, b);
50 if (a != 5 * q || r != 6 * q || T<Q>::t != 7 * q || b != 8 * q)
59 #pragma omp parallel for firstprivate (a, T<Q>::t, b, f) lastprivate (A::a, r, T<Q>::t, n)
60 for (int i = 0; i < omp_get_num_threads (); i++)
62 int q = omp_get_thread_num ();
65 if (A::a != -5 || A::b != -4 || T<Q>::t != -2)
68 else if (a != q || b != 2 * q || r != 3 * q || T<Q>::t != 4 * q)
70 take (a, r, T<Q>::t, b);
78 if (a != n || r != 3 * n || T<Q>::t != 4 * n)
83 for (int i = 0; i < 5; i++)
84 #pragma omp task firstprivate (T<Q>::t, b, n) private (a, R::r)
86 if (T<Q>::t != 4 * n || b != 8)
92 take (a, r, T<Q>::t, b);
93 if (a != 9 || r != 8 || T<Q>::t != 12 || b != 18)
100 #pragma omp parallel private (f)
104 #pragma omp taskloop firstprivate (r, T<Q>::t, b, f) lastprivate (a, T<Q>::t, b, n)
105 for (int i = 0; i < 30; i++)
107 int q = omp_get_thread_num ();
110 if (R::r != 3 || A::b != 2 || T<Q>::t != 4)
113 else if (a != 7 * q || b != 8 * q || r != 9 * q || T<Q>::t != 10 * q)
115 take (a, r, T<Q>::t, b);
124 if (a != 7 * n || b != 8 * n || T<Q>::t != 10 * n)
130 #pragma omp parallel private (f)
134 #pragma omp taskloop firstprivate (r, T<Q>::t, b, A::a, f)
135 for (int i = 0; i < 30; i++)
137 int q = omp_get_thread_num ();
140 if (A::a != 1 || R::r != 3 || A::b != 2 || T<Q>::t != 4)
143 else if (a != 7 * q || b != 8 * q || r != 9 * q || T<Q>::t != 10 * q)
145 take (a, r, T<Q>::t, b);
153 #pragma omp parallel private (f)
157 #pragma omp taskloop lastprivate (a, T<Q>::t, b, n) private (R::r)
158 for (int i = 0; i < 30; i++)
160 int q = omp_get_thread_num ();
161 if (f && (a != 7 * q || b != 8 * q || r != 9 * q || T<Q>::t != 10 * q))
163 take (a, r, T<Q>::t, b);
172 if (a != 7 * n || b != 8 * n || T<Q>::t != 10 * n)
174 #pragma omp parallel private (a, T<Q>::t, A::b, r)
176 int q = omp_get_thread_num ();
181 take (a, b, r, T<Q>::t);
182 #pragma omp single copyprivate (A::a, T<Q>::t, b, R::r)
184 if (a != n || b != 2 * n || r != 3 * n || T<Q>::t != 4 * n)
191 #pragma omp parallel for reduction (+: A::a, T<Q>::t, b, R::r)
192 for (int i = 0; i < 30; i++)
198 take (a, b, r, T<Q>::t);
200 if (A::a != 435 || b != 2 * 435 || R::r != 3 * 435 || T<Q>::t != 4 * 435)