1// { dg-do run } 2 3extern "C" void abort (); 4 5template <typename T> 6class J 7{ 8public: 9 J(T x, T y) : b (x), e (y) {} 10 T begin (); 11 T end (); 12private: 13 T b, e; 14}; 15 16template <typename T> T J<T>::begin () { return b; } 17template <typename T> T J<T>::end () { return e; } 18 19int results[2000]; 20 21void 22baz (int i) 23{ 24 if (i < 0 || i >= 2000) 25 abort (); 26 results[i]++; 27} 28 29void 30f1 (int x, int y) 31{ 32#pragma omp parallel for 33 for (int i = x; i <= y; i += 6) 34 baz (i); 35} 36 37void 38f2 (int x, int y) 39{ 40 int i; 41#pragma omp parallel for private(i) 42 for (i = x; i < y - 1; i = 1 - 6 + 7 + i) 43 baz (i); 44} 45 46template <typename T> 47void 48f3 (int x, int y) 49{ 50#pragma omp parallel for 51 for (int i = x; i <= y; i = i + 9 - 8) 52 baz (i); 53} 54 55template <typename T> 56void 57f4 (int x, int y) 58{ 59 int i; 60#pragma omp parallel for lastprivate(i) 61 for (i = x + 2000 - 64; i > y + 10; --i) 62 baz (i); 63} 64 65void 66f5 (int x, int y) 67{ 68#pragma omp parallel for 69 for (int i = x + 2000 - 64; i > y + 10L; i -= 10L) 70 baz (i); 71} 72 73template <int N> 74void 75f6 (int x, int y) 76{ 77#pragma omp parallel for 78 for (int i = x + 2000 - 64; i > y + 10L; i = i - 12 + 2L) 79 baz (i + N); 80} 81 82template <long N> 83void 84f7 (int i, int x, int y) 85{ 86#pragma omp parallel for 87 for (i = x - 10; i <= y + 10; i += N) 88 baz (i); 89} 90 91template <long N> 92void 93f8 (J<int> j) 94{ 95 int i; 96#pragma omp parallel for 97 for (i = j.begin (); i <= j.end () + N; i += 2) 98 baz (i); 99} 100 101template <typename T, long N> 102void 103f9 (T x, T y) 104{ 105#pragma omp parallel for 106 for (T i = x; i <= y; i = i + N) 107 baz (i); 108} 109 110template <typename T, long N> 111void 112f10 (T x, T y) 113{ 114 T i; 115#pragma omp parallel for 116 for (i = x; i > y; i = i + N) 117 baz (i); 118} 119 120template <typename T> 121void 122f11 (T x, long y) 123{ 124#pragma omp parallel 125 { 126#pragma omp for nowait 127 for (T i = x; i <= y; i += 3L) 128 baz (i); 129#pragma omp single 130 baz (y + 3); 131 } 132} 133 134template <typename T> 135void 136f12 (T x, T y) 137{ 138 T i; 139#pragma omp parallel for 140 for (i = x; i > y; --i) 141 baz (i); 142} 143 144#define check(expr) \ 145 for (int i = 0; i < 2000; i++) \ 146 if (expr) \ 147 { \ 148 if (results[i] != 1) \ 149 abort (); \ 150 results[i] = 0; \ 151 } \ 152 else if (results[i]) \ 153 abort () 154 155int 156main () 157{ 158 f1 (10, 1990); 159 check (i >= 10 && i <= 1990 && (i - 10) % 6 == 0); 160 f2 (0, 1999); 161 check (i < 1998 && (i & 1) == 0); 162 f3<char> (20, 1837); 163 check (i >= 20 && i <= 1837); 164 f4<int> (0, 30); 165 check (i > 40 && i <= 2000 - 64); 166 f5 (0, 100); 167 check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0); 168 f6<-10> (10, 110); 169 check (i >= 116 && i <= 2000 - 64 && (i - 116) % 10 == 0); 170 f7<6> (0, 12, 1800); 171 check (i >= 2 && i <= 1808 && (i - 2) % 6 == 0); 172 f8<121> (J<int> (14, 1803)); 173 check (i >= 14 && i <= 1924 && (i & 1) == 0); 174 f9<int, 7> (33, 1967); 175 check (i >= 33 && i <= 1967 && (i - 33) % 7 == 0); 176 f10<int, -7> (1939, 17); 177 check (i >= 21 && i <= 1939 && (i - 21) % 7 == 0); 178 f11<int> (16, 1981); 179 check (i >= 16 && i <= 1984 && (i - 16) % 3 == 0); 180 f12<int> (1761, 37); 181 check (i > 37 && i <= 1761); 182} 183