| // PR c++/86291 | |
| // { dg-do run } | |
| // { dg-additional-options "-std=c++11" } | |
| extern "C" void abort (); | |
| struct I | |
| { | |
| using size_type = __SIZE_TYPE__; | |
| using difference_type = __PTRDIFF_TYPE__; | |
| using value_type = int; | |
| using reference = int &; | |
| using pointer = int *; | |
| static I begin () { return I{}; } | |
| static I end () { I res; res.pos = res.num; return res; } | |
| I &operator++ () { ++pos; return *this; } | |
| reference operator* () const { return val; } | |
| I &operator+= (size_type diff) { pos += diff; return *this; } | |
| friend bool operator< (const I &a, const I &b) { return a.pos < b.pos; } | |
| friend difference_type operator- (const I &a, const I &b) { return a.pos - b.pos; } | |
| size_type pos = 0; | |
| size_type num = 1; | |
| mutable int val = 0; | |
| }; | |
| int c; | |
| int | |
| main () | |
| { | |
| #pragma omp parallel for collapse(10) | |
| for (auto i = I::begin (); i < I::end (); ++i) | |
| for (auto j = I::begin (); j < I::end (); ++j) | |
| for (auto k = I::begin (); k < I::end (); ++k) | |
| for (auto l = I::begin (); l < I::end (); ++l) | |
| for (auto m = I::begin (); m < I::end (); ++m) | |
| for (auto n = I::begin (); n < I::end (); ++n) | |
| for (auto o = I::begin (); o < I::end (); ++o) | |
| for (auto p = I::begin (); p < I::end (); ++p) | |
| for (auto q = I::begin (); q < I::end (); ++q) | |
| for (auto r = I::begin (); r < I::end (); ++r) | |
| { | |
| if (*i != 0 || *j != 0 || *k != 0 || *l != 0 || *m != 0 | |
| || *n != 0 || *o != 0 || *p != 0 || *q != 0 || *r != 0) | |
| abort (); | |
| #pragma omp atomic | |
| c++; | |
| } | |
| if (c != 1) | |
| abort (); | |
| } |