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