// 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 (); }