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