brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 15a3407 Raw
469 lines · cpp
1// RUN: %check_clang_tidy %s hicpp-multiway-paths-covered %t2 3enum OS { Mac,4          Windows,5          Linux };6 7struct Bitfields {8  unsigned UInt : 3;9  int SInt : 1;10};11 12int return_integer() { return 42; }13 14void bad_switch(int i) {15  switch (i) {16    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: switch with only one case; use an if statement17  case 0:18    break;19  }20  // No default in this switch21  switch (i) {22  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: potential uncovered code path; add a default label23  case 0:24    break;25  case 1:26    break;27  case 2:28    break;29  }30 31  // degenerate, maybe even warning32  switch (i) {33    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: switch statement without labels has no effect34  }35 36  switch (int j = return_integer()) {37  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: potential uncovered code path; add a default label38  case 0:39  case 1:40  case 2:41    break;42  }43 44  // Degenerated, only default case.45  switch (i) {46    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: degenerated switch with default label only47  default:48    break;49  }50 51  // Degenerated, only one case label and default case -> Better as if-stmt.52  switch (i) {53    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: switch could be better written as an if/else statement54  case 0:55    break;56  default:57    break;58  }59 60  unsigned long long BigNumber = 0;61  switch (BigNumber) {62  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: potential uncovered code path; add a default label63  case 0:64  case 1:65    break;66  }67 68  const int &IntRef = i;69  switch (IntRef) {70  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: potential uncovered code path; add a default label71  case 0:72  case 1:73    break;74  }75 76  char C = 'A';77  switch (C) {78  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: potential uncovered code path; add a default label79  case 'A':80    break;81  case 'B':82    break;83  }84 85  Bitfields Bf;86  // UInt has 3 bits size.87  switch (Bf.UInt) {88    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: potential uncovered code path; add a default label89  case 0:90  case 1:91    break;92  }93  // All paths explicitly covered.94  switch (Bf.UInt) {95  case 0:96  case 1:97  case 2:98  case 3:99  case 4:100  case 5:101  case 6:102  case 7:103    break;104  }105  // SInt has 1 bit size, so this is somewhat degenerated.106  switch (Bf.SInt) {107    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: switch with only one case; use an if statement108  case 0:109    break;110  }111  // All paths explicitly covered.112  switch (Bf.SInt) {113  case 0:114  case 1:115    break;116  }117 118  bool Flag = false;119  switch (Flag) {120    // CHECK-MESSAGES:[[@LINE-1]]:3: warning: switch with only one case; use an if statement121  case true:122    break;123  }124 125  switch (Flag) {126    // CHECK-MESSAGES: [[@LINE-1]]:3: warning: degenerated switch with default label only127  default:128    break;129  }130 131  // This `switch` will create a frontend warning from '-Wswitch-bool' but is132  // ok for this check.133  switch (Flag) {134  case true:135    break;136  case false:137    break;138  }139}140 141void unproblematic_switch(unsigned char c) {142  //143  switch (c) {144  case 0:145  case 1:146  case 2:147  case 3:148  case 4:149  case 5:150  case 6:151  case 7:152  case 8:153  case 9:154  case 10:155  case 11:156  case 12:157  case 13:158  case 14:159  case 15:160  case 16:161  case 17:162  case 18:163  case 19:164  case 20:165  case 21:166  case 22:167  case 23:168  case 24:169  case 25:170  case 26:171  case 27:172  case 28:173  case 29:174  case 30:175  case 31:176  case 32:177  case 33:178  case 34:179  case 35:180  case 36:181  case 37:182  case 38:183  case 39:184  case 40:185  case 41:186  case 42:187  case 43:188  case 44:189  case 45:190  case 46:191  case 47:192  case 48:193  case 49:194  case 50:195  case 51:196  case 52:197  case 53:198  case 54:199  case 55:200  case 56:201  case 57:202  case 58:203  case 59:204  case 60:205  case 61:206  case 62:207  case 63:208  case 64:209  case 65:210  case 66:211  case 67:212  case 68:213  case 69:214  case 70:215  case 71:216  case 72:217  case 73:218  case 74:219  case 75:220  case 76:221  case 77:222  case 78:223  case 79:224  case 80:225  case 81:226  case 82:227  case 83:228  case 84:229  case 85:230  case 86:231  case 87:232  case 88:233  case 89:234  case 90:235  case 91:236  case 92:237  case 93:238  case 94:239  case 95:240  case 96:241  case 97:242  case 98:243  case 99:244  case 100:245  case 101:246  case 102:247  case 103:248  case 104:249  case 105:250  case 106:251  case 107:252  case 108:253  case 109:254  case 110:255  case 111:256  case 112:257  case 113:258  case 114:259  case 115:260  case 116:261  case 117:262  case 118:263  case 119:264  case 120:265  case 121:266  case 122:267  case 123:268  case 124:269  case 125:270  case 126:271  case 127:272  case 128:273  case 129:274  case 130:275  case 131:276  case 132:277  case 133:278  case 134:279  case 135:280  case 136:281  case 137:282  case 138:283  case 139:284  case 140:285  case 141:286  case 142:287  case 143:288  case 144:289  case 145:290  case 146:291  case 147:292  case 148:293  case 149:294  case 150:295  case 151:296  case 152:297  case 153:298  case 154:299  case 155:300  case 156:301  case 157:302  case 158:303  case 159:304  case 160:305  case 161:306  case 162:307  case 163:308  case 164:309  case 165:310  case 166:311  case 167:312  case 168:313  case 169:314  case 170:315  case 171:316  case 172:317  case 173:318  case 174:319  case 175:320  case 176:321  case 177:322  case 178:323  case 179:324  case 180:325  case 181:326  case 182:327  case 183:328  case 184:329  case 185:330  case 186:331  case 187:332  case 188:333  case 189:334  case 190:335  case 191:336  case 192:337  case 193:338  case 194:339  case 195:340  case 196:341  case 197:342  case 198:343  case 199:344  case 200:345  case 201:346  case 202:347  case 203:348  case 204:349  case 205:350  case 206:351  case 207:352  case 208:353  case 209:354  case 210:355  case 211:356  case 212:357  case 213:358  case 214:359  case 215:360  case 216:361  case 217:362  case 218:363  case 219:364  case 220:365  case 221:366  case 222:367  case 223:368  case 224:369  case 225:370  case 226:371  case 227:372  case 228:373  case 229:374  case 230:375  case 231:376  case 232:377  case 233:378  case 234:379  case 235:380  case 236:381  case 237:382  case 238:383  case 239:384  case 240:385  case 241:386  case 242:387  case 243:388  case 244:389  case 245:390  case 246:391  case 247:392  case 248:393  case 249:394  case 250:395  case 251:396  case 252:397  case 253:398  case 254:399  case 255:400    break;401  }402 403  // Some paths are covered by the switch and a default case is present.404  switch (c) {405  case 1:406  case 2:407  case 3:408  default:409    break;410  }411}412 413OS return_enumerator() {414  return Linux;415}416 417// Enumpaths are already covered by a warning, this is just to ensure, that there is418// no interference or false positives.419// -Wswitch warns about uncovered enum paths and each here described case is already420// covered.421void switch_enums(OS os) {422  switch (os) {423  case Linux:424    break;425  }426 427  switch (OS another_os = return_enumerator()) {428  case Linux:429    break;430  }431 432  switch (os) {433  }434}435 436/// All of these cases will not emit a warning per default, but with explicit activation.437/// Covered in extra test file.438void problematic_if(int i, enum OS os) {439  if (i > 0) {440    return;441  } else if (i < 0) {442    return;443  }444 445  if (os == Mac) {446    return;447  } else if (os == Linux) {448    if (true) {449      return;450    } else if (false) {451      return;452    }453    return;454  } else {455    /* unreachable */456    if (true) // check if the parent would match here as well457      return;458  }459 460  // Ok, because all paths are covered461  if (i > 0) {462    return;463  } else if (i < 0) {464    return;465  } else {466    /* error, maybe precondition failed */467  }468}469