1*8e1cb96dSvabridgers // RUN: %check_clang_tidy %s bugprone-branch-clone %t -- 2*8e1cb96dSvabridgers 3*8e1cb96dSvabridgers /* Only one expected warning per function allowed at the very end. */ 4*8e1cb96dSvabridgers 5*8e1cb96dSvabridgers int func(void) 6*8e1cb96dSvabridgers { 7*8e1cb96dSvabridgers return 0; 8*8e1cb96dSvabridgers } 9*8e1cb96dSvabridgers 10*8e1cb96dSvabridgers int func2(void) 11*8e1cb96dSvabridgers { 12*8e1cb96dSvabridgers return 0; 13*8e1cb96dSvabridgers } 14*8e1cb96dSvabridgers 15*8e1cb96dSvabridgers int funcParam(int a) 16*8e1cb96dSvabridgers { 17*8e1cb96dSvabridgers return 0; 18*8e1cb96dSvabridgers } 19*8e1cb96dSvabridgers 20*8e1cb96dSvabridgers /* '!=' operator*/ 21*8e1cb96dSvabridgers 22*8e1cb96dSvabridgers 23*8e1cb96dSvabridgers /* '!=' with int pointer */ 24*8e1cb96dSvabridgers 25*8e1cb96dSvabridgers int checkNotEqualIntPointerLiteralCompare1(void) { 26*8e1cb96dSvabridgers int* p = 0; 27*8e1cb96dSvabridgers return (p != 0); // no warning 28*8e1cb96dSvabridgers } 29*8e1cb96dSvabridgers 30*8e1cb96dSvabridgers int checkNotEqualIntPointerLiteralCompare2(void) { 31*8e1cb96dSvabridgers return (6 != 7); // no warning 32*8e1cb96dSvabridgers } 33*8e1cb96dSvabridgers 34*8e1cb96dSvabridgers int checkNotEqualIntPointerDeclCompare1(void) { 35*8e1cb96dSvabridgers int k = 3; 36*8e1cb96dSvabridgers int* f = &k; 37*8e1cb96dSvabridgers int* g = &k; 38*8e1cb96dSvabridgers return (f != g); // no warning 39*8e1cb96dSvabridgers } 40*8e1cb96dSvabridgers 41*8e1cb96dSvabridgers int checkNotEqualCastIntPointerDeclCompare11(void) { 42*8e1cb96dSvabridgers int k = 7; 43*8e1cb96dSvabridgers int* f = &k; 44*8e1cb96dSvabridgers return ((int*)f != (int*)f); 45*8e1cb96dSvabridgers } 46*8e1cb96dSvabridgers int checkNotEqualCastIntPointerDeclCompare12(void) { 47*8e1cb96dSvabridgers int k = 7; 48*8e1cb96dSvabridgers int* f = &k; 49*8e1cb96dSvabridgers return ((int*)((char*)f) != (int*)f); // no warning 50*8e1cb96dSvabridgers } 51*8e1cb96dSvabridgers int checkNotEqualBinaryOpIntPointerCompare1(void) { 52*8e1cb96dSvabridgers int k = 7; 53*8e1cb96dSvabridgers int res; 54*8e1cb96dSvabridgers int* f= &k; 55*8e1cb96dSvabridgers res = (f + 4 != f + 4); 56*8e1cb96dSvabridgers return (0); 57*8e1cb96dSvabridgers } 58*8e1cb96dSvabridgers int checkNotEqualBinaryOpIntPointerCompare2(void) { 59*8e1cb96dSvabridgers int k = 7; 60*8e1cb96dSvabridgers int* f = &k; 61*8e1cb96dSvabridgers int* g = &k; 62*8e1cb96dSvabridgers return (f + 4 != g + 4); // no warning 63*8e1cb96dSvabridgers } 64*8e1cb96dSvabridgers 65*8e1cb96dSvabridgers 66*8e1cb96dSvabridgers int checkNotEqualBinaryOpIntPointerCompare3(void) { 67*8e1cb96dSvabridgers int k = 7; 68*8e1cb96dSvabridgers int res; 69*8e1cb96dSvabridgers int* f= &k; 70*8e1cb96dSvabridgers res = ((int*)f + 4 != (int*)f + 4); 71*8e1cb96dSvabridgers return (0); 72*8e1cb96dSvabridgers } 73*8e1cb96dSvabridgers int checkNotEqualBinaryOpIntPointerCompare4(void) { 74*8e1cb96dSvabridgers int k = 7; 75*8e1cb96dSvabridgers int res; 76*8e1cb96dSvabridgers int* f= &k; 77*8e1cb96dSvabridgers res = ((int*)f + 4 != (int*)((char*)f) + 4); // no warning 78*8e1cb96dSvabridgers return (0); 79*8e1cb96dSvabridgers } 80*8e1cb96dSvabridgers 81*8e1cb96dSvabridgers int checkNotEqualNestedBinaryOpIntPointerCompare1(void) { 82*8e1cb96dSvabridgers int res; 83*8e1cb96dSvabridgers int k = 7; 84*8e1cb96dSvabridgers int t= 1; 85*8e1cb96dSvabridgers int* u= &k+2; 86*8e1cb96dSvabridgers int* f= &k+3; 87*8e1cb96dSvabridgers res = ((f + (3)*t) != (f + (3)*t)); 88*8e1cb96dSvabridgers return (0); 89*8e1cb96dSvabridgers } 90*8e1cb96dSvabridgers 91*8e1cb96dSvabridgers int checkNotEqualNestedBinaryOpIntPointerCompare2(void) { 92*8e1cb96dSvabridgers int res; 93*8e1cb96dSvabridgers int k = 7; 94*8e1cb96dSvabridgers int t= 1; 95*8e1cb96dSvabridgers int* u= &k+2; 96*8e1cb96dSvabridgers int* f= &k+3; 97*8e1cb96dSvabridgers res = (((3)*t + f) != (f + (3)*t)); // no warning 98*8e1cb96dSvabridgers return (0); 99*8e1cb96dSvabridgers } 100*8e1cb96dSvabridgers /* end '!=' int* */ 101*8e1cb96dSvabridgers 102*8e1cb96dSvabridgers /* '!=' with function*/ 103*8e1cb96dSvabridgers 104*8e1cb96dSvabridgers int checkNotEqualSameFunction() { 105*8e1cb96dSvabridgers unsigned a = 0; 106*8e1cb96dSvabridgers unsigned b = 1; 107*8e1cb96dSvabridgers int res = (a+func() != a+func()); // no warning 108*8e1cb96dSvabridgers return (0); 109*8e1cb96dSvabridgers } 110*8e1cb96dSvabridgers 111*8e1cb96dSvabridgers int checkNotEqualDifferentFunction() { 112*8e1cb96dSvabridgers unsigned a = 0; 113*8e1cb96dSvabridgers unsigned b = 1; 114*8e1cb96dSvabridgers int res = (a+func() != a+func2()); // no warning 115*8e1cb96dSvabridgers return (0); 116*8e1cb96dSvabridgers } 117*8e1cb96dSvabridgers 118*8e1cb96dSvabridgers int checkNotEqualSameFunctionSameParam() { 119*8e1cb96dSvabridgers unsigned a = 0; 120*8e1cb96dSvabridgers unsigned b = 1; 121*8e1cb96dSvabridgers int res = (a+funcParam(a) != a+funcParam(a)); // no warning 122*8e1cb96dSvabridgers return (0); 123*8e1cb96dSvabridgers } 124*8e1cb96dSvabridgers 125*8e1cb96dSvabridgers int checkNotEqualSameFunctionDifferentParam() { 126*8e1cb96dSvabridgers unsigned a = 0; 127*8e1cb96dSvabridgers unsigned b = 1; 128*8e1cb96dSvabridgers int res = (a+funcParam(a) != a+funcParam(b)); // no warning 129*8e1cb96dSvabridgers return (0); 130*8e1cb96dSvabridgers } 131*8e1cb96dSvabridgers 132*8e1cb96dSvabridgers /* end '!=' with function*/ 133*8e1cb96dSvabridgers 134*8e1cb96dSvabridgers /* end '!=' */ 135*8e1cb96dSvabridgers 136*8e1cb96dSvabridgers 137*8e1cb96dSvabridgers /* Checking use of identical expressions in conditional operator*/ 138*8e1cb96dSvabridgers 139*8e1cb96dSvabridgers unsigned test_unsigned(unsigned a) { 140*8e1cb96dSvabridgers unsigned b = 1; 141*8e1cb96dSvabridgers a = a > 5 ? b : b; 142*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 143*8e1cb96dSvabridgers return a; 144*8e1cb96dSvabridgers } 145*8e1cb96dSvabridgers 146*8e1cb96dSvabridgers void test_signed() { 147*8e1cb96dSvabridgers int a = 0; 148*8e1cb96dSvabridgers a = a > 5 ? a : a; 149*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 150*8e1cb96dSvabridgers } 151*8e1cb96dSvabridgers 152*8e1cb96dSvabridgers void test_bool(bool a) { 153*8e1cb96dSvabridgers a = a > 0 ? a : a; 154*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 155*8e1cb96dSvabridgers } 156*8e1cb96dSvabridgers 157*8e1cb96dSvabridgers void test_float() { 158*8e1cb96dSvabridgers float a = 0; 159*8e1cb96dSvabridgers float b = 0; 160*8e1cb96dSvabridgers a = a > 5 ? a : a; 161*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 162*8e1cb96dSvabridgers } 163*8e1cb96dSvabridgers 164*8e1cb96dSvabridgers const char *test_string() { 165*8e1cb96dSvabridgers float a = 0; 166*8e1cb96dSvabridgers return a > 5 ? "abc" : "abc"; 167*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 168*8e1cb96dSvabridgers } 169*8e1cb96dSvabridgers 170*8e1cb96dSvabridgers void test_unsigned_expr() { 171*8e1cb96dSvabridgers unsigned a = 0; 172*8e1cb96dSvabridgers unsigned b = 0; 173*8e1cb96dSvabridgers a = a > 5 ? a+b : a+b; 174*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 175*8e1cb96dSvabridgers } 176*8e1cb96dSvabridgers 177*8e1cb96dSvabridgers void test_signed_expr() { 178*8e1cb96dSvabridgers int a = 0; 179*8e1cb96dSvabridgers int b = 1; 180*8e1cb96dSvabridgers a = a > 5 ? a+b : a+b; 181*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 182*8e1cb96dSvabridgers } 183*8e1cb96dSvabridgers 184*8e1cb96dSvabridgers void test_bool_expr(bool a) { 185*8e1cb96dSvabridgers bool b = 0; 186*8e1cb96dSvabridgers a = a > 0 ? a&&b : a&&b; 187*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 188*8e1cb96dSvabridgers } 189*8e1cb96dSvabridgers 190*8e1cb96dSvabridgers void test_unsigned_expr_negative() { 191*8e1cb96dSvabridgers unsigned a = 0; 192*8e1cb96dSvabridgers unsigned b = 0; 193*8e1cb96dSvabridgers a = a > 5 ? a+b : b+a; // no warning 194*8e1cb96dSvabridgers } 195*8e1cb96dSvabridgers 196*8e1cb96dSvabridgers void test_signed_expr_negative() { 197*8e1cb96dSvabridgers int a = 0; 198*8e1cb96dSvabridgers int b = 1; 199*8e1cb96dSvabridgers a = a > 5 ? b+a : a+b; // no warning 200*8e1cb96dSvabridgers } 201*8e1cb96dSvabridgers 202*8e1cb96dSvabridgers void test_bool_expr_negative(bool a) { 203*8e1cb96dSvabridgers bool b = 0; 204*8e1cb96dSvabridgers a = a > 0 ? a&&b : b&&a; // no warning 205*8e1cb96dSvabridgers } 206*8e1cb96dSvabridgers 207*8e1cb96dSvabridgers void test_float_expr_positive() { 208*8e1cb96dSvabridgers float a = 0; 209*8e1cb96dSvabridgers float b = 0; 210*8e1cb96dSvabridgers a = a > 5 ? a+b : a+b; 211*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 212*8e1cb96dSvabridgers } 213*8e1cb96dSvabridgers 214*8e1cb96dSvabridgers void test_expr_positive_func() { 215*8e1cb96dSvabridgers unsigned a = 0; 216*8e1cb96dSvabridgers unsigned b = 1; 217*8e1cb96dSvabridgers a = a > 5 ? a+func() : a+func(); 218*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 219*8e1cb96dSvabridgers } 220*8e1cb96dSvabridgers 221*8e1cb96dSvabridgers void test_expr_negative_func() { 222*8e1cb96dSvabridgers unsigned a = 0; 223*8e1cb96dSvabridgers unsigned b = 1; 224*8e1cb96dSvabridgers a = a > 5 ? a+func() : a+func2(); // no warning 225*8e1cb96dSvabridgers } 226*8e1cb96dSvabridgers 227*8e1cb96dSvabridgers void test_expr_positive_funcParam() { 228*8e1cb96dSvabridgers unsigned a = 0; 229*8e1cb96dSvabridgers unsigned b = 1; 230*8e1cb96dSvabridgers a = a > 5 ? a+funcParam(b) : a+funcParam(b); 231*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 232*8e1cb96dSvabridgers } 233*8e1cb96dSvabridgers 234*8e1cb96dSvabridgers void test_expr_negative_funcParam() { 235*8e1cb96dSvabridgers unsigned a = 0; 236*8e1cb96dSvabridgers unsigned b = 1; 237*8e1cb96dSvabridgers a = a > 5 ? a+funcParam(a) : a+funcParam(b); // no warning 238*8e1cb96dSvabridgers } 239*8e1cb96dSvabridgers 240*8e1cb96dSvabridgers void test_expr_positive_inc() { 241*8e1cb96dSvabridgers unsigned a = 0; 242*8e1cb96dSvabridgers unsigned b = 1; 243*8e1cb96dSvabridgers a = a > 5 ? a++ : a++; 244*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 245*8e1cb96dSvabridgers } 246*8e1cb96dSvabridgers 247*8e1cb96dSvabridgers void test_expr_negative_inc() { 248*8e1cb96dSvabridgers unsigned a = 0; 249*8e1cb96dSvabridgers unsigned b = 1; 250*8e1cb96dSvabridgers a = a > 5 ? a++ : b++; // no warning 251*8e1cb96dSvabridgers } 252*8e1cb96dSvabridgers 253*8e1cb96dSvabridgers void test_expr_positive_assign() { 254*8e1cb96dSvabridgers unsigned a = 0; 255*8e1cb96dSvabridgers unsigned b = 1; 256*8e1cb96dSvabridgers a = a > 5 ? a=1 : a=1; 257*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 258*8e1cb96dSvabridgers } 259*8e1cb96dSvabridgers 260*8e1cb96dSvabridgers void test_expr_negative_assign() { 261*8e1cb96dSvabridgers unsigned a = 0; 262*8e1cb96dSvabridgers unsigned b = 1; 263*8e1cb96dSvabridgers a = a > 5 ? a=1 : a=2; // no warning 264*8e1cb96dSvabridgers } 265*8e1cb96dSvabridgers 266*8e1cb96dSvabridgers void test_signed_nested_expr() { 267*8e1cb96dSvabridgers int a = 0; 268*8e1cb96dSvabridgers int b = 1; 269*8e1cb96dSvabridgers int c = 3; 270*8e1cb96dSvabridgers a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a)); 271*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 272*8e1cb96dSvabridgers } 273*8e1cb96dSvabridgers 274*8e1cb96dSvabridgers void test_signed_nested_expr_negative() { 275*8e1cb96dSvabridgers int a = 0; 276*8e1cb96dSvabridgers int b = 1; 277*8e1cb96dSvabridgers int c = 3; 278*8e1cb96dSvabridgers a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(a+c)); // no warning 279*8e1cb96dSvabridgers } 280*8e1cb96dSvabridgers 281*8e1cb96dSvabridgers void test_signed_nested_cond_expr_negative() { 282*8e1cb96dSvabridgers int a = 0; 283*8e1cb96dSvabridgers int b = 1; 284*8e1cb96dSvabridgers int c = 3; 285*8e1cb96dSvabridgers a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 2 : 4); // no warning 286*8e1cb96dSvabridgers } 287*8e1cb96dSvabridgers 288*8e1cb96dSvabridgers void test_signed_nested_cond_expr() { 289*8e1cb96dSvabridgers int a = 0; 290*8e1cb96dSvabridgers int b = 1; 291*8e1cb96dSvabridgers int c = 3; 292*8e1cb96dSvabridgers a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4); 293*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 294*8e1cb96dSvabridgers } 295*8e1cb96dSvabridgers 296*8e1cb96dSvabridgers void test_identical_branches1(bool b) { 297*8e1cb96dSvabridgers int i = 0; 298*8e1cb96dSvabridgers if (b) { 299*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 300*8e1cb96dSvabridgers ++i; 301*8e1cb96dSvabridgers } else { 302*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 303*8e1cb96dSvabridgers ++i; 304*8e1cb96dSvabridgers } 305*8e1cb96dSvabridgers } 306*8e1cb96dSvabridgers 307*8e1cb96dSvabridgers void test_identical_branches2(bool b) { 308*8e1cb96dSvabridgers int i = 0; 309*8e1cb96dSvabridgers if (b) { 310*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 311*8e1cb96dSvabridgers ++i; 312*8e1cb96dSvabridgers } else 313*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 314*8e1cb96dSvabridgers ++i; 315*8e1cb96dSvabridgers } 316*8e1cb96dSvabridgers 317*8e1cb96dSvabridgers void test_identical_branches3(bool b) { 318*8e1cb96dSvabridgers int i = 0; 319*8e1cb96dSvabridgers if (b) { // no warning 320*8e1cb96dSvabridgers ++i; 321*8e1cb96dSvabridgers } else { 322*8e1cb96dSvabridgers i++; 323*8e1cb96dSvabridgers } 324*8e1cb96dSvabridgers } 325*8e1cb96dSvabridgers 326*8e1cb96dSvabridgers void test_identical_branches4(bool b) { 327*8e1cb96dSvabridgers int i = 0; 328*8e1cb96dSvabridgers if (b) { 329*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 330*8e1cb96dSvabridgers } else { 331*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 332*8e1cb96dSvabridgers } 333*8e1cb96dSvabridgers } 334*8e1cb96dSvabridgers 335*8e1cb96dSvabridgers void test_identical_branches_break(bool b) { 336*8e1cb96dSvabridgers while (true) { 337*8e1cb96dSvabridgers if (b) 338*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] 339*8e1cb96dSvabridgers break; 340*8e1cb96dSvabridgers else 341*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 342*8e1cb96dSvabridgers break; 343*8e1cb96dSvabridgers } 344*8e1cb96dSvabridgers } 345*8e1cb96dSvabridgers 346*8e1cb96dSvabridgers void test_identical_branches_continue(bool b) { 347*8e1cb96dSvabridgers while (true) { 348*8e1cb96dSvabridgers if (b) 349*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] 350*8e1cb96dSvabridgers continue; 351*8e1cb96dSvabridgers else 352*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 353*8e1cb96dSvabridgers continue; 354*8e1cb96dSvabridgers } 355*8e1cb96dSvabridgers } 356*8e1cb96dSvabridgers 357*8e1cb96dSvabridgers void test_identical_branches_func(bool b) { 358*8e1cb96dSvabridgers if (b) 359*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 360*8e1cb96dSvabridgers func(); 361*8e1cb96dSvabridgers else 362*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: note: else branch starts here 363*8e1cb96dSvabridgers func(); 364*8e1cb96dSvabridgers } 365*8e1cb96dSvabridgers 366*8e1cb96dSvabridgers void test_identical_branches_func_arguments(bool b) { 367*8e1cb96dSvabridgers if (b) // no-warning 368*8e1cb96dSvabridgers funcParam(1); 369*8e1cb96dSvabridgers else 370*8e1cb96dSvabridgers funcParam(2); 371*8e1cb96dSvabridgers } 372*8e1cb96dSvabridgers 373*8e1cb96dSvabridgers void test_identical_branches_cast1(bool b) { 374*8e1cb96dSvabridgers long v = -7; 375*8e1cb96dSvabridgers if (b) // no-warning 376*8e1cb96dSvabridgers v = (signed int) v; 377*8e1cb96dSvabridgers else 378*8e1cb96dSvabridgers v = (unsigned int) v; 379*8e1cb96dSvabridgers } 380*8e1cb96dSvabridgers 381*8e1cb96dSvabridgers void test_identical_branches_cast2(bool b) { 382*8e1cb96dSvabridgers long v = -7; 383*8e1cb96dSvabridgers if (b) 384*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 385*8e1cb96dSvabridgers v = (signed int) v; 386*8e1cb96dSvabridgers else 387*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: note: else branch starts here 388*8e1cb96dSvabridgers v = (signed int) v; 389*8e1cb96dSvabridgers } 390*8e1cb96dSvabridgers 391*8e1cb96dSvabridgers int test_identical_branches_return_int(bool b) { 392*8e1cb96dSvabridgers int i = 0; 393*8e1cb96dSvabridgers if (b) { 394*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 395*8e1cb96dSvabridgers i++; 396*8e1cb96dSvabridgers return i; 397*8e1cb96dSvabridgers } else { 398*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 399*8e1cb96dSvabridgers i++; 400*8e1cb96dSvabridgers return i; 401*8e1cb96dSvabridgers } 402*8e1cb96dSvabridgers } 403*8e1cb96dSvabridgers 404*8e1cb96dSvabridgers int test_identical_branches_return_func(bool b) { 405*8e1cb96dSvabridgers if (b) { 406*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 407*8e1cb96dSvabridgers return func(); 408*8e1cb96dSvabridgers } else { 409*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 410*8e1cb96dSvabridgers return func(); 411*8e1cb96dSvabridgers } 412*8e1cb96dSvabridgers } 413*8e1cb96dSvabridgers 414*8e1cb96dSvabridgers void test_identical_branches_for(bool b) { 415*8e1cb96dSvabridgers int i; 416*8e1cb96dSvabridgers int j; 417*8e1cb96dSvabridgers if (b) { 418*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 419*8e1cb96dSvabridgers for (i = 0, j = 0; i < 10; i++) 420*8e1cb96dSvabridgers j += 4; 421*8e1cb96dSvabridgers } else { 422*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 423*8e1cb96dSvabridgers for (i = 0, j = 0; i < 10; i++) 424*8e1cb96dSvabridgers j += 4; 425*8e1cb96dSvabridgers } 426*8e1cb96dSvabridgers } 427*8e1cb96dSvabridgers 428*8e1cb96dSvabridgers void test_identical_branches_while(bool b) { 429*8e1cb96dSvabridgers int i = 10; 430*8e1cb96dSvabridgers if (b) { 431*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 432*8e1cb96dSvabridgers while (func()) 433*8e1cb96dSvabridgers i--; 434*8e1cb96dSvabridgers } else { 435*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 436*8e1cb96dSvabridgers while (func()) 437*8e1cb96dSvabridgers i--; 438*8e1cb96dSvabridgers } 439*8e1cb96dSvabridgers } 440*8e1cb96dSvabridgers 441*8e1cb96dSvabridgers void test_identical_branches_while_2(bool b) { 442*8e1cb96dSvabridgers int i = 10; 443*8e1cb96dSvabridgers if (b) { // no-warning 444*8e1cb96dSvabridgers while (func()) 445*8e1cb96dSvabridgers i--; 446*8e1cb96dSvabridgers } else { 447*8e1cb96dSvabridgers while (func()) 448*8e1cb96dSvabridgers i++; 449*8e1cb96dSvabridgers } 450*8e1cb96dSvabridgers } 451*8e1cb96dSvabridgers 452*8e1cb96dSvabridgers void test_identical_branches_do_while(bool b) { 453*8e1cb96dSvabridgers int i = 10; 454*8e1cb96dSvabridgers if (b) { 455*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 456*8e1cb96dSvabridgers do { 457*8e1cb96dSvabridgers i--; 458*8e1cb96dSvabridgers } while (func()); 459*8e1cb96dSvabridgers } else { 460*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 461*8e1cb96dSvabridgers do { 462*8e1cb96dSvabridgers i--; 463*8e1cb96dSvabridgers } while (func()); 464*8e1cb96dSvabridgers } 465*8e1cb96dSvabridgers } 466*8e1cb96dSvabridgers 467*8e1cb96dSvabridgers void test_identical_branches_if(bool b, int i) { 468*8e1cb96dSvabridgers if (b) { 469*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] 470*8e1cb96dSvabridgers if (i < 5) 471*8e1cb96dSvabridgers i += 10; 472*8e1cb96dSvabridgers } else { 473*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here 474*8e1cb96dSvabridgers if (i < 5) 475*8e1cb96dSvabridgers i += 10; 476*8e1cb96dSvabridgers } 477*8e1cb96dSvabridgers } 478*8e1cb96dSvabridgers 479*8e1cb96dSvabridgers void test_identical_bitwise1() { 480*8e1cb96dSvabridgers int a = 5 | 5; // no-warning 481*8e1cb96dSvabridgers } 482*8e1cb96dSvabridgers 483*8e1cb96dSvabridgers void test_identical_bitwise2() { 484*8e1cb96dSvabridgers int a = 5; 485*8e1cb96dSvabridgers int b = a | a; // no-warning 486*8e1cb96dSvabridgers } 487*8e1cb96dSvabridgers 488*8e1cb96dSvabridgers void test_identical_bitwise3() { 489*8e1cb96dSvabridgers int a = 5; 490*8e1cb96dSvabridgers int b = (a | a); // no-warning 491*8e1cb96dSvabridgers } 492*8e1cb96dSvabridgers 493*8e1cb96dSvabridgers void test_identical_bitwise4() { 494*8e1cb96dSvabridgers int a = 4; 495*8e1cb96dSvabridgers int b = a | 4; // no-warning 496*8e1cb96dSvabridgers } 497*8e1cb96dSvabridgers 498*8e1cb96dSvabridgers void test_identical_bitwise5() { 499*8e1cb96dSvabridgers int a = 4; 500*8e1cb96dSvabridgers int b = 4; 501*8e1cb96dSvabridgers int c = a | b; // no-warning 502*8e1cb96dSvabridgers } 503*8e1cb96dSvabridgers 504*8e1cb96dSvabridgers void test_identical_bitwise6() { 505*8e1cb96dSvabridgers int a = 5; 506*8e1cb96dSvabridgers int b = a | 4 | a; 507*8e1cb96dSvabridgers } 508*8e1cb96dSvabridgers 509*8e1cb96dSvabridgers void test_identical_bitwise7() { 510*8e1cb96dSvabridgers int a = 5; 511*8e1cb96dSvabridgers int b = func() | func(); 512*8e1cb96dSvabridgers } 513*8e1cb96dSvabridgers 514*8e1cb96dSvabridgers void test_identical_logical1(int a) { 515*8e1cb96dSvabridgers if (a == 4 && a == 4) 516*8e1cb96dSvabridgers ; 517*8e1cb96dSvabridgers } 518*8e1cb96dSvabridgers 519*8e1cb96dSvabridgers void test_identical_logical2(int a) { 520*8e1cb96dSvabridgers if (a == 4 || a == 5 || a == 4) 521*8e1cb96dSvabridgers ; 522*8e1cb96dSvabridgers } 523*8e1cb96dSvabridgers 524*8e1cb96dSvabridgers void test_identical_logical3(int a) { 525*8e1cb96dSvabridgers if (a == 4 || a == 5 || a == 6) // no-warning 526*8e1cb96dSvabridgers ; 527*8e1cb96dSvabridgers } 528*8e1cb96dSvabridgers 529*8e1cb96dSvabridgers void test_identical_logical4(int a) { 530*8e1cb96dSvabridgers if (a == func() || a == func()) // no-warning 531*8e1cb96dSvabridgers ; 532*8e1cb96dSvabridgers } 533*8e1cb96dSvabridgers 534*8e1cb96dSvabridgers #pragma clang diagnostic push 535*8e1cb96dSvabridgers #pragma clang diagnostic ignored "-Wlogical-op-parentheses" 536*8e1cb96dSvabridgers void test_identical_logical5(int x, int y) { 537*8e1cb96dSvabridgers if (x == 4 && y == 5 || x == 4 && y == 6) // no-warning 538*8e1cb96dSvabridgers ; 539*8e1cb96dSvabridgers } 540*8e1cb96dSvabridgers 541*8e1cb96dSvabridgers void test_identical_logical6(int x, int y) { 542*8e1cb96dSvabridgers if (x == 4 && y == 5 || x == 4 && y == 5) 543*8e1cb96dSvabridgers ; 544*8e1cb96dSvabridgers } 545*8e1cb96dSvabridgers 546*8e1cb96dSvabridgers void test_identical_logical7(int x, int y) { 547*8e1cb96dSvabridgers // FIXME: We should warn here 548*8e1cb96dSvabridgers if (x == 4 && y == 5 || x == 4) 549*8e1cb96dSvabridgers ; 550*8e1cb96dSvabridgers } 551*8e1cb96dSvabridgers 552*8e1cb96dSvabridgers void test_identical_logical8(int x, int y) { 553*8e1cb96dSvabridgers // FIXME: We should warn here 554*8e1cb96dSvabridgers if (x == 4 || y == 5 && x == 4) 555*8e1cb96dSvabridgers ; 556*8e1cb96dSvabridgers } 557*8e1cb96dSvabridgers 558*8e1cb96dSvabridgers void test_identical_logical9(int x, int y) { 559*8e1cb96dSvabridgers // FIXME: We should warn here 560*8e1cb96dSvabridgers if (x == 4 || x == 4 && y == 5) 561*8e1cb96dSvabridgers ; 562*8e1cb96dSvabridgers } 563*8e1cb96dSvabridgers #pragma clang diagnostic pop 564*8e1cb96dSvabridgers 565*8e1cb96dSvabridgers void test_warn_chained_if_stmts_1(int x) { 566*8e1cb96dSvabridgers if (x == 1) 567*8e1cb96dSvabridgers ; 568*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 569*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 570*8e1cb96dSvabridgers else if (x == 1) 571*8e1cb96dSvabridgers ; 572*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 573*8e1cb96dSvabridgers } 574*8e1cb96dSvabridgers 575*8e1cb96dSvabridgers void test_warn_chained_if_stmts_2(int x) { 576*8e1cb96dSvabridgers if (x == 1) 577*8e1cb96dSvabridgers ; 578*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 579*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 580*8e1cb96dSvabridgers else if (x == 1) 581*8e1cb96dSvabridgers ; 582*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 583*8e1cb96dSvabridgers else if (x == 1) 584*8e1cb96dSvabridgers ; 585*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 586*8e1cb96dSvabridgers } 587*8e1cb96dSvabridgers 588*8e1cb96dSvabridgers void test_warn_chained_if_stmts_3(int x) { 589*8e1cb96dSvabridgers if (x == 1) 590*8e1cb96dSvabridgers ; 591*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 592*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 593*8e1cb96dSvabridgers else if (x == 2) 594*8e1cb96dSvabridgers ; 595*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 596*8e1cb96dSvabridgers else if (x == 1) 597*8e1cb96dSvabridgers ; 598*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 599*8e1cb96dSvabridgers } 600*8e1cb96dSvabridgers 601*8e1cb96dSvabridgers void test_warn_chained_if_stmts_4(int x) { 602*8e1cb96dSvabridgers if (x == 1) 603*8e1cb96dSvabridgers ; 604*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 605*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 606*8e1cb96dSvabridgers else if (func()) 607*8e1cb96dSvabridgers ; 608*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 609*8e1cb96dSvabridgers else if (x == 1) 610*8e1cb96dSvabridgers ; 611*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 612*8e1cb96dSvabridgers } 613*8e1cb96dSvabridgers 614*8e1cb96dSvabridgers void test_warn_chained_if_stmts_5(int x) { 615*8e1cb96dSvabridgers if (x & 1) 616*8e1cb96dSvabridgers ; 617*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 618*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 619*8e1cb96dSvabridgers else if (x & 1) 620*8e1cb96dSvabridgers ; 621*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 622*8e1cb96dSvabridgers } 623*8e1cb96dSvabridgers 624*8e1cb96dSvabridgers void test_warn_chained_if_stmts_6(int x) { 625*8e1cb96dSvabridgers if (x == 1) 626*8e1cb96dSvabridgers ; 627*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 628*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 629*8e1cb96dSvabridgers else if (x == 2) 630*8e1cb96dSvabridgers ; 631*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 632*8e1cb96dSvabridgers else if (x == 2) 633*8e1cb96dSvabridgers ; 634*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 635*8e1cb96dSvabridgers else if (x == 3) 636*8e1cb96dSvabridgers ; 637*8e1cb96dSvabridgers } 638*8e1cb96dSvabridgers 639*8e1cb96dSvabridgers void test_warn_chained_if_stmts_7(int x) { 640*8e1cb96dSvabridgers if (x == 1) 641*8e1cb96dSvabridgers ; 642*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 643*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 644*8e1cb96dSvabridgers else if (x == 2) 645*8e1cb96dSvabridgers ; 646*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 647*8e1cb96dSvabridgers else if (x == 3) 648*8e1cb96dSvabridgers ; 649*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 650*8e1cb96dSvabridgers else if (x == 2) 651*8e1cb96dSvabridgers ; 652*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 3 starts here 653*8e1cb96dSvabridgers else if (x == 5) 654*8e1cb96dSvabridgers ; 655*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 4 starts here 656*8e1cb96dSvabridgers } 657*8e1cb96dSvabridgers 658*8e1cb96dSvabridgers void test_warn_chained_if_stmts_8(int x) { 659*8e1cb96dSvabridgers if (x == 1) 660*8e1cb96dSvabridgers ; 661*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 662*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 663*8e1cb96dSvabridgers else if (x == 2) 664*8e1cb96dSvabridgers ; 665*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 666*8e1cb96dSvabridgers else if (x == 3) 667*8e1cb96dSvabridgers ; 668*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 669*8e1cb96dSvabridgers else if (x == 2) 670*8e1cb96dSvabridgers ; 671*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 3 starts here 672*8e1cb96dSvabridgers else if (x == 5) 673*8e1cb96dSvabridgers ; 674*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 4 starts here 675*8e1cb96dSvabridgers else if (x == 3) 676*8e1cb96dSvabridgers ; 677*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 5 starts here 678*8e1cb96dSvabridgers else if (x == 7) 679*8e1cb96dSvabridgers ; 680*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 6 starts here 681*8e1cb96dSvabridgers } 682*8e1cb96dSvabridgers 683*8e1cb96dSvabridgers void test_nowarn_chained_if_stmts_1(int x) { 684*8e1cb96dSvabridgers if (func()) 685*8e1cb96dSvabridgers ; 686*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 687*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 688*8e1cb96dSvabridgers else if (func()) 689*8e1cb96dSvabridgers ; 690*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 691*8e1cb96dSvabridgers } 692*8e1cb96dSvabridgers 693*8e1cb96dSvabridgers void test_nowarn_chained_if_stmts_2(int x) { 694*8e1cb96dSvabridgers if (func()) 695*8e1cb96dSvabridgers ; 696*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 697*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 698*8e1cb96dSvabridgers else if (x == 1) 699*8e1cb96dSvabridgers ; 700*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 701*8e1cb96dSvabridgers else if (func()) 702*8e1cb96dSvabridgers ; 703*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here 704*8e1cb96dSvabridgers } 705*8e1cb96dSvabridgers 706*8e1cb96dSvabridgers void test_nowarn_chained_if_stmts_3(int x) { 707*8e1cb96dSvabridgers if (x++) 708*8e1cb96dSvabridgers ; 709*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] 710*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original 711*8e1cb96dSvabridgers else if (x++) 712*8e1cb96dSvabridgers ; 713*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here 714*8e1cb96dSvabridgers } 715*8e1cb96dSvabridgers 716*8e1cb96dSvabridgers void test_warn_wchar() { 717*8e1cb96dSvabridgers const wchar_t * a = 0 ? L"Warning" : L"Warning"; 718*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] 719*8e1cb96dSvabridgers } 720*8e1cb96dSvabridgers void test_nowarn_wchar() { 721*8e1cb96dSvabridgers const wchar_t * a = 0 ? L"No" : L"Warning"; 722*8e1cb96dSvabridgers } 723*8e1cb96dSvabridgers 724*8e1cb96dSvabridgers void test_nowarn_long() { 725*8e1cb96dSvabridgers int a = 0, b = 0; 726*8e1cb96dSvabridgers long c; 727*8e1cb96dSvabridgers if (0) { 728*8e1cb96dSvabridgers b -= a; 729*8e1cb96dSvabridgers c = 0; 730*8e1cb96dSvabridgers } else { 731*8e1cb96dSvabridgers b -= a; 732*8e1cb96dSvabridgers c = 0LL; 733*8e1cb96dSvabridgers } 734*8e1cb96dSvabridgers } 735*8e1cb96dSvabridgers 736*8e1cb96dSvabridgers // Identical inner conditions 737*8e1cb96dSvabridgers 738*8e1cb96dSvabridgers void test_warn_inner_if_1(int x) { 739*8e1cb96dSvabridgers if (x == 1) { 740*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical inner if statement [bugprone-branch-clone] 741*8e1cb96dSvabridgers if (x == 1) 742*8e1cb96dSvabridgers // CHECK-MESSAGES: :[[@LINE-1]]:5: note: inner if starts here 743*8e1cb96dSvabridgers ; 744*8e1cb96dSvabridgers } 745*8e1cb96dSvabridgers 746*8e1cb96dSvabridgers // FIXME: Should warn here. The warning is currently not emitted because there 747*8e1cb96dSvabridgers // is code between the conditions. 748*8e1cb96dSvabridgers if (x == 1) { 749*8e1cb96dSvabridgers int y = x; 750*8e1cb96dSvabridgers if (x == 1) 751*8e1cb96dSvabridgers ; 752*8e1cb96dSvabridgers } 753*8e1cb96dSvabridgers } 754*8e1cb96dSvabridgers 755*8e1cb96dSvabridgers void test_nowarn_inner_if_1(int x) { 756*8e1cb96dSvabridgers // Don't warn when condition has side effects. 757*8e1cb96dSvabridgers if (x++ == 1) { 758*8e1cb96dSvabridgers if (x++ == 1) 759*8e1cb96dSvabridgers ; 760*8e1cb96dSvabridgers } 761*8e1cb96dSvabridgers 762*8e1cb96dSvabridgers // Don't warn when x is changed before inner condition. 763*8e1cb96dSvabridgers if (x < 10) { 764*8e1cb96dSvabridgers x++; 765*8e1cb96dSvabridgers if (x < 10) 766*8e1cb96dSvabridgers ; 767*8e1cb96dSvabridgers } 768*8e1cb96dSvabridgers } 769