1 // { dg-do run } 2 3 int c, d, e; RR4struct R { R () {}; ~R () {}; int r; }; 5 template <typename Q> TT6struct T { T () : t(d) {}; virtual ~T () {}; Q t; }; 7 template <typename Q> AA8struct 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()13A<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()104main () 105 { 106 A<int> a; 107 a.m1 (); 108 } 109