gcc/libgomp/testsuite/libgomp.c++/pr86291.C
Jakub Jelinek f03915116b re PR c++/86291 (OpenMP incorrect for-loop collapsing with iterators and at least 5 nested loops)
PR c++/86291
	* parser.c (cp_parser_omp_for_loop_init): Change for_block argument
	type from vec<tree, va_gc> * to vec<tree, va_gc> *&.

	* testsuite/libgomp.c++/pr86291.C: New test.

From-SVN: r262137
2018-06-26 12:40:50 +02:00

52 lines
1.5 KiB
C

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