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