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