2015-11-30 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / member-1.C
blobc7c1ba4de8ad61884fde73cff4aa6a7b8adbe62d
1 // { dg-do run }
3 #include <omp.h>
5 struct R { R () {}; ~R () {}; int r; };
6 struct T { T () {}; virtual ~T () {}; int t; };
7 int c;
8 struct A : public R, virtual public T { A () : b(c) {} int a; int &b; void m1 (); };
10 void
11 take (int &a, int &b, int &c, int &d)
13   asm volatile ("" : : "g" (&a), "g" (&b), "g" (&c), "g" (&d) : "memory");
16 void
17 A::m1 ()
19   #pragma omp parallel private (a, r, T::t, A::b)
20   {
21     int q = omp_get_thread_num ();
22     a = q;
23     r = 2 * q;
24     t = 3 * q;
25     b = 4 * q;
26     take (a, r, t, b);
27     #pragma omp barrier
28     if (A::a != q || R::r != 2 * q || T::t != 3 * q || A::b != 4 * q)
29       __builtin_abort ();
30   }
31   a = 7;
32   r = 8;
33   t = 9;
34   b = 10;
35   #pragma omp parallel firstprivate (A::a, R::r, t, b)
36   {
37     int q = omp_get_thread_num ();
38     take (A::a, R::r, T::t, A::b);
39     if (a != 7 || r != 8 || t != 9 || b != 10)
40       __builtin_abort ();
41     A::a = 5 * q;
42     R::r = 6 * q;
43     T::t = 7 * q;
44     A::b = 8 * q;
45     take (a, r, t, b);
46     #pragma omp barrier
47     if (a != 5 * q || r != 6 * q || t != 7 * q || b != 8 * q)
48       __builtin_abort ();
49   }
50   bool f = false;
51   a = -5;
52   b = -4;
53   r = -3;
54   t = -2;
55   int n;
56   #pragma omp parallel for firstprivate (a, T::t, b, f) lastprivate (A::a, r, t, n)
57   for (int i = 0; i < omp_get_num_threads (); i++)
58     {
59       int q = omp_get_thread_num ();
60       if (!f)
61         {
62           if (A::a != -5 || A::b != -4 || T::t != -2)
63             __builtin_abort ();
64         }
65       else if (a != q || b != 2 * q || r != 3 * q || t != 4 * q)
66         __builtin_abort ();
67       take (a, r, t, b);
68       A::a = q;
69       A::b = 2 * q;
70       R::r = 3 * q;
71       T::t = 4 * q;
72       n = q;
73       f = true;
74     }
75   if (a != n || r != 3 * n || T::t != 4 * n)
76     __builtin_abort ();
77   b = 8;
78   #pragma omp parallel
79     #pragma omp single
80       for (int i = 0; i < 5; i++)
81         #pragma omp task firstprivate (t, b, n) private (a, R::r)
82           {
83             if (t != 4 * n || b != 8)
84               __builtin_abort ();
85             a = 9;
86             r = 8;
87             t = 12;
88             b = 18;
89             take (a, r, t, b);
90             if (a != 9 || r != 8 || t != 12 || b != 18)
91               __builtin_abort ();
92           }
93   a = 1;
94   b = 2;
95   R::r = 3;
96   t = 4;
97   #pragma omp parallel private (f)
98     {
99       f = false;
100     #pragma omp single
101     #pragma omp taskloop firstprivate (r, T::t, b, f) lastprivate (a, t, b, n)
102       for (int i = 0; i < 30; i++)
103         {
104           int q = omp_get_thread_num ();
105           if (!f)
106             {
107               if (R::r != 3 || A::b != 2 || T::t != 4)
108                 __builtin_abort ();
109             }
110           else if (a != 7 * q || b != 8 * q || r != 9 * q || t != 10 * q)
111             __builtin_abort ();
112           take (a, r, t, b);
113           A::a = 7 * q;
114           A::b = 8 * q;
115           R::r = 9 * q;
116           T::t = 10 * q;
117           n = q;
118           f = true;
119         }
120     }
121   if (a != 7 * n || b != 8 * n || t != 10 * n)
122     __builtin_abort ();
123   a = 1;
124   b = 2;
125   R::r = 3;
126   t = 4;
127   #pragma omp parallel private (f)
128     {
129       f = false;
130     #pragma omp single
131     #pragma omp taskloop firstprivate (r, T::t, b, A::a, f)
132       for (int i = 0; i < 30; i++)
133         {
134           int q = omp_get_thread_num ();
135           if (!f)
136             {
137               if (A::a != 1 || R::r != 3 || A::b != 2 || T::t != 4)
138                 __builtin_abort ();
139             }
140           else if (a != 7 * q || b != 8 * q || r != 9 * q || t != 10 * q)
141             __builtin_abort ();
142           take (a, r, t, b);
143           A::a = 7 * q;
144           A::b = 8 * q;
145           R::r = 9 * q;
146           T::t = 10 * q;
147           f = true;
148         }
149     }
150   #pragma omp parallel private (f)
151     {
152       f = false;
153     #pragma omp single
154     #pragma omp taskloop lastprivate (a, t, b, n) private (R::r)
155       for (int i = 0; i < 30; i++)
156         {
157           int q = omp_get_thread_num ();
158           if (f && (a != 7 * q || b != 8 * q || r != 9 * q || t != 10 * q))
159             __builtin_abort ();
160           take (a, r, t, b);
161           A::a = 7 * q;
162           A::b = 8 * q;
163           R::r = 9 * q;
164           T::t = 10 * q;
165           n = q;
166           f = true;
167         }
168     }
169   if (a != 7 * n || b != 8 * n || t != 10 * n)
170     __builtin_abort ();
171   #pragma omp parallel private (a, T::t, A::b, r)
172     {
173       int q = omp_get_thread_num ();
174       a = q;
175       b = 2 * q;
176       r = 3 * q;
177       t = 4 * q;
178       take (a, b, r, t);
179       #pragma omp single copyprivate (A::a, t, b, R::r)
180         n = q;
181       if (a != n || b != 2 * n || r != 3 * n || t != 4 * n)
182         __builtin_abort ();
183     }
184   a = 0;
185   b = 0;
186   R::r = 0;
187   t = 0;
188   #pragma omp parallel for reduction (+: A::a, t, b, R::r)
189   for (int i = 0; i < 30; i++)
190     {
191       a += i;
192       A::b += 2 * i;
193       r += 3 * i;
194       T::t += 4 * i;
195       take (a, b, r, t);
196     }
197   if (A::a != 435 || b != 2 * 435 || R::r != 3 * 435 || t != 4 * 435)
198     __builtin_abort ();
202 main ()
204   A a;
205   a.m1 ();