1 typedef __PTRDIFF_TYPE__ ptrdiff_t;
2 
3 template <typename T>
4 class I
5 {
6 public:
7   typedef ptrdiff_t difference_type;
8   I ();
9   ~I ();
10   I (T *);
11   I (const I &);
12   T &operator * ();
13   T *operator -> ();
14   T &operator [] (const difference_type &) const;
15   I &operator = (const I &);
16   I &operator ++ ();
17   I operator ++ (int);
18   I &operator -- ();
19   I operator -- (int);
20   I &operator += (const difference_type &);
21   I &operator -= (const difference_type &);
22   I operator + (const difference_type &) const;
23   I operator - (const difference_type &) const;
24   template <typename S> friend bool operator == (I<S> &, I<S> &);
25   template <typename S> friend bool operator == (const I<S> &, const I<S> &);
26   template <typename S> friend bool operator < (I<S> &, I<S> &);
27   template <typename S> friend bool operator < (const I<S> &, const I<S> &);
28   template <typename S> friend bool operator <= (I<S> &, I<S> &);
29   template <typename S> friend bool operator <= (const I<S> &, const I<S> &);
30   template <typename S> friend bool operator > (I<S> &, I<S> &);
31   template <typename S> friend bool operator > (const I<S> &, const I<S> &);
32   template <typename S> friend bool operator >= (I<S> &, I<S> &);
33   template <typename S> friend bool operator >= (const I<S> &, const I<S> &);
34   template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &);
35   template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &);
36   template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &);
37 private:
38   T *p;
39 };
40 
41 template <typename T> bool operator == (I<T> &, I<T> &);
42 template <typename T> bool operator == (const I<T> &, const I<T> &);
43 template <typename T> bool operator != (I<T> &, I<T> &);
44 template <typename T> bool operator != (const I<T> &, const I<T> &);
45 template <typename T> bool operator < (I<T> &, I<T> &);
46 template <typename T> bool operator < (const I<T> &, const I<T> &);
47 template <typename T> bool operator <= (I<T> &, I<T> &);
48 template <typename T> bool operator <= (const I<T> &, const I<T> &);
49 template <typename T> bool operator > (I<T> &, I<T> &);
50 template <typename T> bool operator > (const I<T> &, const I<T> &);
51 template <typename T> bool operator >= (I<T> &, I<T> &);
52 template <typename T> bool operator >= (const I<T> &, const I<T> &);
53 template <typename T> typename I<T>::difference_type operator - (I<T> &, I<T> &);
54 template <typename T> typename I<T>::difference_type operator - (const I<T> &, const I<T> &);
55 template <typename T> I<T> operator + (typename I<T>::difference_type, const I<T> &);
56 
57 ptrdiff_t foo (I<int> &);
58 I<int> &bar (I<int> &);
59 I<int> &baz (I<int> *);
60 
61 void
f1(I<int> & x,I<int> & y,I<int> & u,I<int> & v)62 f1 (I<int> &x, I<int> &y, I<int> &u, I<int> &v)
63 {
64   I<int> i, j;
65   #pragma omp for
66   for (i = x; i < y; i++)
67     ;
68   #pragma omp for
69   for (i = x; y > i; i++)
70     ;
71   #pragma omp for
72   for (i = x; i < y; i = i + 2)
73     ;
74   #pragma omp for
75   for (i = x; i < y; i = 2 + i)
76     ;
77   #pragma omp for
78   for (i = i; i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
79     ;
80   #pragma omp for
81   for (i = i + 3; i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
82     ;
83   #pragma omp for
84   for (i = bar (i); i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
85     ;
86   #pragma omp for
87   for (i = baz (&i); i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
88     ;
89   #pragma omp for
90   for (i = x; i <= i + 5; i++) /* { dg-error "condition expression refers to iteration variable" } */
91     ;
92   #pragma omp for
93   for (i = x; i <= baz (&i); i++) /* { dg-error "condition expression refers to iteration variable" } */
94     ;
95   #pragma omp for
96   for (i = x; baz (&i) > i; i++) /* { dg-error "condition expression refers to iteration variable" } */
97     ;
98   #pragma omp for
99   for (i = x; i <= i; i++) /* { dg-error "invalid controlling predicate|condition expression refers to iteration variable" } */
100     ;
101   #pragma omp for
102   for (i = x; i < y; i += foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
103     ;
104   #pragma omp for
105   for (i = x; i < y; i = i + foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
106     ;
107   #pragma omp for
108   for (i = x; i < y; i = foo (i) + i) /* { dg-error "increment expression refers to iteration variable" } */
109     ;
110   #pragma omp for collapse(2)
111   for (i = x; i < y; i = i + 2)
112     for (j = u; j < y; j += 2)
113       ;
114   #pragma omp for collapse(2)
115   for (i = j; i < y; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */
116     for (j = x; j < y; j++)
117       ;
118   #pragma omp for collapse(2)
119   for (i = x; i < y; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */
120     for (j = i; j < v; j += 2)
121       ;
122   #pragma omp for collapse(2)
123   for (i = x; i < y; i = i + 2)
124     for (j = i + 3; j < v; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
125       ;
126   #pragma omp for collapse(2)
127   for (i = x; i < y; i++)
128     for (j = baz (&i); j < v; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
129       ;
130   #pragma omp for collapse(2)
131   for (i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
132     for (j = v; j > i; j--)
133       ;
134   #pragma omp for collapse(2)
135   for (i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
136     for (j = x; j < i; j++)
137       ;
138   #pragma omp for collapse(2)
139   for (i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
140     for (j = u; j < i + 4; j++)
141       ;
142   #pragma omp for collapse(2)
143   for (i = x; i < j + 4; i++) /* { dg-error "condition expression refers to iteration variable" } */
144     for (j = u; j < v; j++)
145       ;
146   #pragma omp for collapse(2)
147   for (i = x; i < j; i++) /* { dg-error "condition expression refers to iteration variable" } */
148     for (j = u; j < v; j++)
149       ;
150   #pragma omp for collapse(2)
151   for (i = x; i < bar (j); i++) /* { dg-error "condition expression refers to iteration variable" } */
152     for (j = u; j < v; j++)
153       ;
154   #pragma omp for collapse(2)
155   for (i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
156     for (j = u; j < baz (&i); j++)
157       ;
158   #pragma omp for collapse(2)
159   for (i = x; i < y; i += foo (j)) /* { dg-error "increment expression refers to iteration variable" } */
160     for (j = u; j < v; j++)
161       ;
162   #pragma omp for collapse(2)
163   for (i = x; i < y; i++)
164     for (j = u; j < v; j += foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
165       ;
166   #pragma omp for collapse(2)
167   for (i = x; i < y; i = foo (j) + i) /* { dg-error "increment expression refers to iteration variable" } */
168     for (j = u; j < v; j++)
169       ;
170   #pragma omp for collapse(2)
171   for (i = x; i < y; i++)
172     for (j = u; j < y; j = j + (i - v)) /* { dg-error "increment expression refers to iteration variable" } */
173       ;
174   #pragma omp for collapse(2)
175   for (i = x; i < y; i = foo (j) + i) /* { dg-error "increment expression refers to iteration variable" } */
176     for (j = u; j < v; j++)
177       ;
178   #pragma omp for collapse(2)
179   for (i = x; i < y; i++)
180     for (j = u; j < v; j = j + foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
181       ;
182 }
183 
184 void
f2(I<int> & x,I<int> & y,I<int> & u,I<int> & v)185 f2 (I<int> &x, I<int> &y, I<int> &u, I<int> &v)
186 {
187   #pragma omp for
188   for (I<int> i = x; i < y; i++)
189     ;
190   #pragma omp for
191   for (I<int> i = x; y > i; i++)
192     ;
193   #pragma omp for
194   for (I<int> i = x; i < y; i = i + 2)
195     ;
196   #pragma omp for
197   for (I<int> i = x; i < y; i = 2 + i)
198     ;
199   #pragma omp for
200   for (I<int> i = i; i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
201     ;
202   #pragma omp for
203   for (I<int> i = i + 3; i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
204     ;
205   #pragma omp for
206   for (I<int> i = bar (i); i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
207     ;
208   #pragma omp for
209   for (I<int> i = baz (&i); i < y; i++) /* { dg-error "initializer expression refers to iteration variable" } */
210     ;
211   #pragma omp for
212   for (I<int> i = x; i <= i + 5; i++) /* { dg-error "condition expression refers to iteration variable" } */
213     ;
214   #pragma omp for
215   for (I<int> i = x; i <= baz (&i); i++) /* { dg-error "condition expression refers to iteration variable" } */
216     ;
217   #pragma omp for
218   for (I<int> i = x; baz (&i) > i; i++) /* { dg-error "condition expression refers to iteration variable" } */
219     ;
220   #pragma omp for
221   for (I<int> i = x; i <= i; i++) /* { dg-error "invalid controlling predicate|condition expression refers to iteration variable" } */
222     ;
223   #pragma omp for
224   for (I<int> i = x; i < y; i += foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
225     ;
226   #pragma omp for
227   for (I<int> i = x; i < y; i = i + foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
228     ;
229   #pragma omp for
230   for (I<int> i = x; i < y; i = foo (i) + i) /* { dg-error "increment expression refers to iteration variable" } */
231     ;
232   #pragma omp for collapse(2)
233   for (I<int> i = x; i < y; i = i + 2)
234     for (I<int> j = u; j < y; j += 2)
235       ;
236   #pragma omp for collapse(2)
237   for (I<int> i = x; i < y; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */
238     for (I<int> j = i; j < v; j += 2)
239       ;
240   #pragma omp for collapse(2)
241   for (I<int> i = x; i < y; i = i + 2)
242     for (I<int> j = i + 3; j < v; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
243       ;
244   #pragma omp for collapse(2)
245   for (I<int> i = x; i < y; i++)
246     for (I<int> j = baz (&i); j < v; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
247       ;
248   #pragma omp for collapse(2)
249   for (I<int> i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
250     for (I<int> j = v; j > i; j--)
251       ;
252   #pragma omp for collapse(2)
253   for (I<int> i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
254     for (I<int> j = x; j < i; j++)
255       ;
256   #pragma omp for collapse(2)
257   for (I<int> i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
258     for (I<int> j = u; j < i + 4; j++)
259       ;
260   #pragma omp for collapse(2)
261   for (I<int> i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */
262     for (I<int> j = u; j < baz (&i); j++)
263       ;
264   #pragma omp for collapse(2)
265   for (I<int> i = x; i < y; i++)
266     for (I<int> j = u; j < v; j += foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
267       ;
268   #pragma omp for collapse(2)
269   for (I<int> i = x; i < y; i++)
270     for (I<int> j = u; j < y; j = j + (i - v)) /* { dg-error "increment expression refers to iteration variable" } */
271       ;
272   #pragma omp for collapse(2)
273   for (I<int> i = x; i < y; i++)
274     for (I<int> j = u; j < v; j = j + foo (i)) /* { dg-error "increment expression refers to iteration variable" } */
275       ;
276 }
277 
278 void
f3(I<int> & x,I<int> & y,I<int> & u,I<int> & v)279 f3 (I<int> &x, I<int> &y, I<int> &u, I<int> &v)
280 {
281   I<int> j;
282   #pragma omp for collapse(2)
283   for (I<int> i = j; i < y; i = i + 2)
284     for (I<int> j = x; j < y; j++)
285       ;
286   #pragma omp for collapse(2)
287   for (I<int> i = x; i < j + 4; i++)
288     for (I<int> j = u; j < v; j++)
289       ;
290   #pragma omp for collapse(2)
291   for (I<int> i = x; i < j; i++)
292     for (I<int> j = u; j < v; j++)
293       ;
294   #pragma omp for collapse(2)
295   for (I<int> i = x; i < bar (j); i++)
296     for (I<int> j = u; j < v; j++)
297       ;
298   #pragma omp for collapse(2)
299   for (I<int> i = x; i < y; i += foo (j))
300     for (I<int> j = u; j < v; j++)
301       ;
302   #pragma omp for collapse(2)
303   for (I<int> i = x; i < y; i = foo (j) + i)
304     for (I<int> j = u; j < v; j++)
305       ;
306 }
307