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()10void 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()28void 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()45void 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()60int main () 61 { 62 foo2 <0> (); 63 foo3 <int> (); 64 } 65