1694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu// RUN: %clang_cc1 -fsyntax-only -Wloop-analysis -verify %s
2694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
3694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieustruct S {
4694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  bool stop() { return false; }
5694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  bool keep_running;
6694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu};
7694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
8694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid by_ref(int &value) { }
9694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid by_value(int value) { }
10694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid by_pointer(int *value) {}
11694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
12694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid test1() {
13694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  S s;
14694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; !s.stop();) {}
15694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; s.keep_running;) {}
16694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ++i) {}
17694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) {}  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
18694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { ++i; }
19694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { return; }
20694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { break; }
21694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { goto exit_loop; }
22694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuexit_loop:
23694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { by_ref(i); }
24694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { by_value(i); }  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
25694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ) { by_pointer(&i); }
26694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
27694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ++i)
28694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu    for (int j; j < 1; ++j)
29694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu      { }
30694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ++i)
31694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu    for (int j; j < 1; ++i)  // expected-warning {{variable 'j' used in loop condition not modified in loop body}}
32694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu      { }
33694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int i; i < 1; ++i)
34694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu    for (int j; i < 1; ++j)  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
35694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu      { }
36694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
37694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int *i, *j; i < j; ++i) {}
38694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int *i, *j; i < j;) {}  // expected-warning {{variables 'i' and 'j' used in loop condition not modified in loop body}}
39694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
40694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Dereferencing pointers is ignored for now.
41694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int *i; *i; ) {}
42694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu}
43694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
44694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid test2() {
45694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  int i, j, k;
46694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  int *ptr;
47694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
48694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing CastExpr
49694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
50694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i; ) { i = 5; }
51694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
52694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing BinaryOperator
53694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < j; ) {} // expected-warning {{variables 'i' and 'j' used in loop condition not modified in loop body}}
54694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < j; ) { i = 5; }
55694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < j; ) { j = 5; }
56694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
57694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing IntegerLiteral
58694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < 5; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
59694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < 5; ) { i = 5; }
60694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
61694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing FloatingLiteral
62694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < 5.0; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
63694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < 5.0; ) { i = 5; }
64694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
65694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing CharacterLiteral
66694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i == 'a'; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
67694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i == 'a'; ) { i = 5; }
68694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
69694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing CXXBoolLiteralExpr
70694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i == true; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
71694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i == true; ) { i = 5; }
72694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
73694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing GNUNullExpr
74694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; ptr == __null; ) {} // expected-warning {{variable 'ptr' used in loop condition not modified in loop body}}
75694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; ptr == __null; ) { ptr = &i; }
76694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
77694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing UnaryOperator
78694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; -i > 5; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
79694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; -i > 5; ) { ++i; }
80694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
81694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing ImaginaryLiteral
82694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i != 3i; ) {} // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
83694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i != 3i; ) { ++i; }
84694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
85694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing ConditionalOperator
8682129e25c8d26d933771bc37aa0e0ed2edd131b4Richard Trieu  for (; i ? j : k; ) {} // expected-warning {{variables 'i', 'j', and 'k' used in loop condition not modified in loop body}}
87694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i ? j : k; ) { ++i; }
88694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i ? j : k; ) { ++j; }
89694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i ? j : k; ) { ++k; }
90694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i; ) { j = i ? i : i; }  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
91694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i; ) { j = (i = 1) ? i : i; }
92694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i; ) { j = i ? i : ++i; }
93694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
94694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing BinaryConditionalOperator
95694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i ?: j; ) {} // expected-warning {{variables 'i' and 'j' used in loop condition not modified in loop body}}
96694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i ?: j; ) { ++i; }
97694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i ?: j; ) { ++j; }
98694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i; ) { j = i ?: i; }  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
99694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
100694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing ParenExpr
101694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; (i); ) { }  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
102694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; (i); ) { ++i; }
103694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
104694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  // Testing non-evaluated variables
105694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < sizeof(j); ) { }  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
106694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < sizeof(j); ) { ++j; }  // expected-warning {{variable 'i' used in loop condition not modified in loop body}}
107694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; i < sizeof(j); ) { ++i; }
108694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu}
109694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
110694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu// False positive and how to silence.
111694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid test3() {
112694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  int x;
113694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  int *ptr = &x;
114694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (;x<5;) { *ptr = 6; }  // expected-warning {{variable 'x' used in loop condition not modified in loop body}}
115694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
116694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (;x<5;) {
117694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu    *ptr = 6;
118694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu    (void)x;
119694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  }
120694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu}
121694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
122694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu// Check ordering and printing of variables.  Max variables is currently 4.
123694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid test4() {
124694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  int a, b, c, d, e, f;
125694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; a;);  // expected-warning {{variable 'a' used in loop condition not modified in loop body}}
126694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; a + b;);  // expected-warning {{variables 'a' and 'b' used in loop condition not modified in loop body}}
12782129e25c8d26d933771bc37aa0e0ed2edd131b4Richard Trieu  for (; a + b + c;);  // expected-warning {{variables 'a', 'b', and 'c' used in loop condition not modified in loop body}}
12882129e25c8d26d933771bc37aa0e0ed2edd131b4Richard Trieu  for (; a + b + c + d;);  // expected-warning {{variables 'a', 'b', 'c', and 'd' used in loop condition not modified in loop body}}
129694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; a + b + c + d + e;);  // expected-warning {{variables used in loop condition not modified in loop body}}
130694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (; a + b + c + d + e + f;);  // expected-warning {{variables used in loop condition not modified in loop body}}
13182129e25c8d26d933771bc37aa0e0ed2edd131b4Richard Trieu  for (; a + c + d + b;);  // expected-warning {{variables 'a', 'c', 'd', and 'b' used in loop condition not modified in loop body}}
13282129e25c8d26d933771bc37aa0e0ed2edd131b4Richard Trieu  for (; d + c + b + a;);  // expected-warning {{variables 'd', 'c', 'b', and 'a' used in loop condition not modified in loop body}}
133694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu}
134694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu
135694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu// Ensure that the warning doesn't fail when lots of variables are used
136694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu// in the conditional.
137694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieuvoid test5() {
138694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int a; a+a+a+a+a+a+a+a+a+a;); // \
139694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu   // expected-warning {{variable 'a' used in loop condition not modified in loop body}}
140694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int a; a+a+a+a+a+a+a+a+a+a+a;); // \
141694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu   // expected-warning {{variable 'a' used in loop condition not modified in loop body}}
142694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int a; a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a;);  // \
143694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu   // expected-warning {{variable 'a' used in loop condition not modified in loop body}}
144694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu  for (int a; a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a;);//\
145694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu   // expected-warning {{variable 'a' used in loop condition not modified in loop body}}
146694e796f462748ab4dc7ecdf4be5da44dd2c8c94Richard Trieu}
1479087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieu
1489087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieu// Ignore global variables and static variables.
1499087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieuint x6;
1509087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieuvoid test6() {
1519087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieu  static int y;
1529087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieu  for (;x6;);
1539087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieu  for (;y;);
1549087599e5ee64ecd30194b3d89f8748ac95c62f7Richard Trieu}
155acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
156acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieuvoid test7() {
157acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  int i;
158acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i++) {  // expected-note{{incremented here}}
159acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) test7();
160acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;  // expected-warning{{incremented both}}
161acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
162acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i++) {  // expected-note{{incremented here}}
163acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) break;
164acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    ++i;  // expected-warning{{incremented both}}
165acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
166acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;++i) {  // expected-note{{incremented here}}
167acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    while (true) return;
168acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;  // expected-warning{{incremented both}}
169acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
170acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;++i) {  // expected-note{{incremented here}}
171acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    ++i;  // expected-warning{{incremented both}}
172acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
173acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
174acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i--) {  // expected-note{{decremented here}}
175acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) test7();
176acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i--;  // expected-warning{{decremented both}}
177acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
178acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i--) {  // expected-note{{decremented here}}
179acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) break;
180acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    --i;  // expected-warning{{decremented both}}
181acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
182acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;--i) {  // expected-note{{decremented here}}
183acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    while (true) return;
184acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i--;  // expected-warning{{decremented both}}
185acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
186acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;--i) {  // expected-note{{decremented here}}
187acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    --i;  // expected-warning{{decremented both}}
188acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
189acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
190acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  // Don't warn when loop is only one statement.
191acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;++i)
192acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;
193acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;--i)
194acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    --i;
195acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
196acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  // Don't warn when loop has continue statement.
197acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i++) {
198acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) continue;
199acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;
200acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
201acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i--) {
202acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) continue;
203acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i--;
204acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
205acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu}
206acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
207acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieustruct iterator {
208acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  iterator operator++() { return *this; }
209acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  iterator operator++(int) { return *this; }
210acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  iterator operator--() { return *this; }
211acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  iterator operator--(int) { return *this; }
212acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu};
213acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieuvoid test8() {
214acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  iterator i;
215acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i++) {  // expected-note{{incremented here}}
216acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) test7();
217acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;  // expected-warning{{incremented both}}
218acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
219acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i++) {  // expected-note{{incremented here}}
220acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) break;
221acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    ++i;  // expected-warning{{incremented both}}
222acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
223acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;++i) {  // expected-note{{incremented here}}
224acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    while (true) return;
225acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;  // expected-warning{{incremented both}}
226acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
227acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;++i) {  // expected-note{{incremented here}}
228acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    ++i;  // expected-warning{{incremented both}}
229acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
230acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
231acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i--) {  // expected-note{{decremented here}}
232acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) test7();
233acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i--;  // expected-warning{{decremented both}}
234acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
235acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i--) {  // expected-note{{decremented here}}
236acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) break;
237acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    --i;  // expected-warning{{decremented both}}
238acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
239acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;--i) {  // expected-note{{decremented here}}
240acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    while (true) return;
241acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i--;  // expected-warning{{decremented both}}
242acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
243acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;--i) {  // expected-note{{decremented here}}
244acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    --i;  // expected-warning{{decremented both}}
245acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
246acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
247acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  // Don't warn when loop is only one statement.
248acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;++i)
249acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;
250acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;--i)
251acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    --i;
252acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu
253acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  // Don't warn when loop has continue statement.
254acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i++) {
255acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) continue;
256acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i++;
257acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
258acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  for (;;i--) {
259acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    if (true) continue;
260acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu    i--;
261acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu  }
262acdbbc7811c6045a718669a8a0740488edbbbd66Richard Trieu}
263