+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
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,
--- /dev/null
+// 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 ();
+}