1 // { dg-do run }
2 
3 int c, d, e;
RR4 struct R { R () {}; ~R () {}; int r; };
5 template <typename Q>
TT6 struct T { T () : t(d) {}; virtual ~T () {}; Q t; };
7 template <typename Q>
AA8 struct A : public R, virtual public T<Q> { A () : b(c), a(e) {} Q a; int &b; void m1 (); };
9 int f[64];
10 
11 template <typename Q>
12 void
m1()13 A<Q>::m1 ()
14 {
15   r = 0;
16   #pragma omp parallel for private (a) reduction(|:R::r)
17   for (a = 0; A::a < 31; a += 2)
18     r |= (1 << A::a);
19   if (r != 0x55555555)
20     __builtin_abort ();
21   #pragma omp parallel for simd linear (R::r)
22   for (R::r = 0; r < 32; R::r++)
23     f[r + 8] |= 1;
24   for (int i = 0; i < 64; i++)
25     if (f[i] != ((i >= 8 && i < 32 + 8) ? 1 : 0))
26       __builtin_abort ();
27   #pragma omp parallel for lastprivate (T<Q>::t)
28   for (T<Q>::t = 0; T<Q>::t < 32; T<Q>::t += 3)
29     f[T<Q>::t + 2] |= 2;
30   if (T<Q>::t != 33)
31     __builtin_abort ();
32   for (int i = 0; i < 64; i++)
33     if (f[i] != (((i >= 8 && i < 32 + 8) ? 1 : 0)
34 		 | ((i >= 2 && i < 32 + 2 && (i - 2) % 3 == 0) ? 2 : 0)))
35       __builtin_abort ();
36   #pragma omp simd linear (T<Q>::t)
37   for (T<Q>::t = 0; T<Q>::t < 32; T<Q>::t++)
38     f[T<Q>::t + 9] |= 4;
39   if (T<Q>::t != 32)
40     __builtin_abort ();
41   for (int i = 0; i < 64; i++)
42     if (f[i] != (((i >= 8 && i < 32 + 8) ? 1 : 0)
43 		 | ((i >= 2 && i < 32 + 2 && (i - 2) % 3 == 0) ? 2 : 0)
44 		 | ((i >= 9 && i < 32 + 9) ? 4 : 0)))
45       __builtin_abort ();
46   r = 0;
47   #pragma omp parallel for reduction(|:r)
48   for (a = 0; A::a < 31; a += 2)
49     r |= (1 << A::a);
50   if (r != 0x55555555)
51     __builtin_abort ();
52   #pragma omp parallel for simd
53   for (R::r = 0; r < 32; R::r += 2)
54     f[r + 8] |= 8;
55   for (int i = 0; i < 64; i++)
56     if (f[i] != (((i >= 8 && i < 32 + 8) ? ((i & 1) ? 1 : (8 | 1)) : 0)
57 		 | ((i >= 2 && i < 32 + 2 && (i - 2) % 3 == 0) ? 2 : 0)
58 		 | ((i >= 9 && i < 32 + 9) ? 4 : 0)))
59       __builtin_abort ();
60   #pragma omp simd collapse(2)
61   for (T<Q>::t = 0; T<Q>::t < 7; T<Q>::t += 2)
62     for (a = 0; A::a < 8; a++)
63       f[((T<Q>::t << 2) | a) + 3] |= 16;
64   if (T<Q>::t != 8 || A::a != 8)
65     __builtin_abort ();
66   for (int i = 0; i < 64; i++)
67     if (f[i] != (((i >= 8 && i < 32 + 8) ? ((i & 1) ? 1 : (8 | 1)) : 0)
68 		 | ((i >= 2 && i < 32 + 2 && (i - 2) % 3 == 0) ? 2 : 0)
69 		 | ((i >= 9 && i < 32 + 9) ? 4 : 0)
70 		 | ((i >= 3 && i < 32 + 3) ? 16 : 0)))
71       __builtin_abort ();
72   T<Q>::t = 32;
73   a = 16;
74   #pragma omp parallel
75   #pragma omp single
76   #pragma omp taskloop simd collapse(2)
77   for (T<Q>::t = 0; T<Q>::t < 7; T<Q>::t += 2)
78     for (A::a = 0; a < 8; A::a++)
79       f[((T<Q>::t << 2) | A::a) + 3] |= 32;
80   if (T<Q>::t != 8 || a != 8)
81     __builtin_abort ();
82   for (int i = 0; i < 64; i++)
83     if (f[i] != (((i >= 8 && i < 32 + 8) ? ((i & 1) ? 1 : (8 | 1)) : 0)
84 		 | ((i >= 2 && i < 32 + 2 && (i - 2) % 3 == 0) ? 2 : 0)
85 		 | ((i >= 9 && i < 32 + 9) ? 4 : 0)
86 		 | ((i >= 3 && i < 32 + 3) ? (16 | 32) : 0)))
87       __builtin_abort ();
88   #pragma omp parallel
89   #pragma omp single
90   #pragma omp taskloop simd
91   for (R::r = 0; r < 31; R::r += 2)
92     f[r + 8] |= 64;
93   if (r != 32)
94     __builtin_abort ();
95   for (int i = 0; i < 64; i++)
96     if (f[i] != (((i >= 8 && i < 32 + 8) ? ((i & 1) ? 1 : (64 | 8 | 1)) : 0)
97 		 | ((i >= 2 && i < 32 + 2 && (i - 2) % 3 == 0) ? 2 : 0)
98 		 | ((i >= 9 && i < 32 + 9) ? 4 : 0)
99 		 | ((i >= 3 && i < 32 + 3) ? (16 | 32) : 0)))
100       __builtin_abort ();
101 }
102 
103 int
main()104 main ()
105 {
106   A<int> a;
107   a.m1 ();
108 }
109