Fix single-threaded build for targets without atomics
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / member-6.C
blob5c0c22bce378a27d16f3bb050f86edf3d30fc316
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, T::t) shared (r, A::b) default(none)
20   {
21     int q = omp_get_thread_num (), q2;
22     a = q;
23     t = 3 * q;
24     #pragma omp single copyprivate (q2)
25     {
26       r = 2 * q;
27       b = 4 * q;
28       q2 = q;
29     }
30     take (a, r, t, b);
31     #pragma omp barrier
32     if (A::a != q || R::r != 2 * q2 || T::t != 3 * q || A::b != 4 * q2)
33       __builtin_abort ();
34   }
35   a = 7;
36   r = 8;
37   t = 9;
38   b = 10;
39   #pragma omp parallel shared (A::a) default (none) firstprivate (R::r, b) shared (t)
40   {
41     int q = omp_get_thread_num (), q2;
42     take (A::a, R::r, T::t, A::b);
43     if (a != 7 || r != 8 || t != 9 || b != 10)
44       __builtin_abort ();
45     R::r = 6 * q;
46     #pragma omp barrier
47     #pragma omp single copyprivate (q2)
48     {
49       A::a = 5 * q;
50       T::t = 7 * q;
51       q2 = q;
52     }
53     A::b = 8 * q;
54     take (a, r, t, b);
55     #pragma omp barrier
56     if (a != 5 * q2 || r != 6 * q || t != 7 * q2 || b != 8 * q)
57       __builtin_abort ();
58   }
59   a = 1;
60   b = 2;
61   R::r = 3;
62   t = 4;
63   bool f = false;
64   #pragma omp parallel private (f)
65     {
66       f = false;
67     #pragma omp single
68     #pragma omp taskloop default(none) firstprivate (r, A::a, f) shared (T::t, b)
69       for (int i = 0; i < 30; i++)
70         {
71           int q = omp_get_thread_num ();
72           int tv, bv;
73           #pragma omp atomic read
74           tv = t;
75           #pragma omp atomic read
76           bv = A::b;
77           if (i == 16)
78             {
79               if (bv != 2 || tv != 4)
80                 __builtin_abort ();
81             }
82           else
83             {
84               if ((bv != 2 && bv != 8) || (tv != 4 && tv != 9))
85                 __builtin_abort ();
86             }
87           if (!f)
88             {
89               if (A::a != 1 || R::r != 3)
90                 __builtin_abort ();
91             }
92           else if (a != 7 * q || r != 9 * q)
93             __builtin_abort ();
94           take (a, r, t, b);
95           A::a = 7 * q;
96           R::r = 9 * q;
97           if (i == 16)
98             {
99               #pragma omp atomic write
100               A::b = 8;
101               #pragma omp atomic write
102               T::t = 9;
103             }
104           f = true;
105         }
106     }
110 main ()
112   A a;
113   a.m1 ();