1 // { dg-do run }
2
3 #include <omp.h>
4
RR5 struct R { R () {}; ~R () {}; int r; };
TT6 struct T { T () {}; virtual ~T () {}; int t; };
7 int c;
AA8 struct A : public R, virtual public T { A () : b(c) {} int a; int &b; void m1 (); };
9
10 void
take(int & a,int & b,int & c,int & d)11 take (int &a, int &b, int &c, int &d)
12 {
13 asm volatile ("" : : "g" (&a), "g" (&b), "g" (&c), "g" (&d) : "memory");
14 }
15
16 void
m1()17 A::m1 ()
18 {
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 }
107 }
108
109 int
main()110 main ()
111 {
112 A a;
113 a.m1 ();
114 }
115