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