re PR c++/86291 (OpenMP incorrect for-loop collapsing with iterators and at least...
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Jun 2018 10:40:50 +0000 (12:40 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 26 Jun 2018 10:40:50 +0000 (12:40 +0200)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr86291.C [new file with mode: 0644]

index aec8eb79b7d64200d2984b45957a116e0d07d0ed..212306599d923220df249e08df43f413211bb0a0 100644 (file)
@@ -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
index 5e1b67c7be65e4eb3da9ea16ab815bf70aa5ef02..a02091e0a5d7b68dae78ad5e74233ee46322ab94 100644 (file)
@@ -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,
index 4510e08baedc625b58c9ca24a69caf63fa58419e..ef0cdd06422195cfdd8cb8babc4793f177e4cf30 100644 (file)
@@ -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.
diff --git a/libgomp/testsuite/libgomp.c++/pr86291.C b/libgomp/testsuite/libgomp.c++/pr86291.C
new file mode 100644 (file)
index 0000000..89c4b2d
--- /dev/null
@@ -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 ();
+}