1 /* { dg-do compile } */
2 
3 /* Tests iterators are allowed in ordered loops and that we keep track
4    of the original iterator DECL for diagnostic purposes.  */
5 
6 #include <iostream>
7 #include <vector>
8 
9 /* Test plain iterator.  */
foo1()10 void foo1 ()
11 {
12   std::vector<int> v;
13   for (int i=1; i<=5; i++) v.push_back(i);
14 
15   std::vector<int>::const_iterator it;
16 
17 #pragma omp parallel for ordered(1)
18   for (it = v.begin(); it < v.end(); ++it)
19     {
20 #pragma omp ordered depend(sink:it-1)
21     std::cout << *it << '\n';
22 #pragma omp ordered depend(source)
23     }
24 }
25 
26 /* Test non-dependent iterator in a template.  */
27 template <int N>
foo2()28 void foo2 ()
29 {
30   std::vector<int> v;
31   for (int i=1; i<=5; i++) v.push_back(i);
32 
33   std::vector<int>::const_iterator it;
34 #pragma omp parallel for ordered(1)
35   for (it = v.begin(); it < v.end(); ++it)
36     {
37 #pragma omp ordered depend(sink:it-1)
38     std::cout << *it << '\n';
39 #pragma omp ordered depend(source)
40     }
41 }
42 
43 /* Test dependent iterator in a template.  */
44 template <typename T>
foo3()45 void foo3 ()
46 {
47   std::vector<T> v;
48   for (int i=1; i<=5; i++) v.push_back(i);
49 
50   typename std::vector<T>::const_iterator it;
51 #pragma omp parallel for ordered(1)
52   for (it = v.begin(); it < v.end(); ++it)
53     {
54 #pragma omp ordered depend(sink:it-1)
55     std::cout << *it << '\n';
56 #pragma omp ordered depend(source)
57     }
58 }
59 
main()60 int main ()
61 {
62   foo2 <0> ();
63   foo3 <int> ();
64 }
65