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
This commit is contained in:
parent
2a73b8e713
commit
f03915116b
4 changed files with 63 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2018-06-26 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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> *&.
|
||||
|
||||
2018-06-23 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* decl.c (bad_specifiers): Add const location_t* parameter and
|
||||
|
|
|
@ -34917,7 +34917,7 @@ cp_parser_omp_for_incr (cp_parser *parser, tree decl)
|
|||
static tree
|
||||
cp_parser_omp_for_loop_init (cp_parser *parser,
|
||||
tree &this_pre_body,
|
||||
vec<tree, va_gc> *for_block,
|
||||
vec<tree, va_gc> *&for_block,
|
||||
tree &init,
|
||||
tree &orig_init,
|
||||
tree &decl,
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2018-06-26 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/86291
|
||||
* testsuite/libgomp.c++/pr86291.C: New test.
|
||||
|
||||
2018-06-24 Gerald Pfeifer <gerald@pfeifer.com>
|
||||
|
||||
* libgomp.texi (Top): Move www.openmp.org to https.
|
||||
|
|
51
libgomp/testsuite/libgomp.c++/pr86291.C
Normal file
51
libgomp/testsuite/libgomp.c++/pr86291.C
Normal file
|
@ -0,0 +1,51 @@
|
|||
// 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 ();
|
||||
}
|
Loading…
Add table
Reference in a new issue