| // RUN: %check_clang_tidy %s hicpp-multiway-paths-covered %t \ |
| // RUN: -config='{CheckOptions: \ |
| // RUN: [{key: hicpp-multiway-paths-covered.WarnOnMissingElse, value: 1}]}'\ |
| // RUN: -- |
| |
| enum OS { Mac, |
| Windows, |
| Linux }; |
| |
| void problematic_if(int i, enum OS os) { |
| if (i > 0) { |
| return; |
| } else if (i < 0) { |
| // CHECK-MESSAGES: [[@LINE-1]]:10: warning: potentially uncovered codepath; add an ending else statement |
| return; |
| } |
| |
| // Could be considered as false positive because all paths are covered logically. |
| // I still think this is valid since the possibility of a final 'everything else' |
| // codepath is expected from if-else if. |
| if (i > 0) { |
| return; |
| } else if (i <= 0) { |
| // CHECK-MESSAGES: [[@LINE-1]]:10: warning: potentially uncovered codepath; add an ending else statement |
| return; |
| } |
| |
| // Test if nesting of if-else chains does get caught as well. |
| if (os == Mac) { |
| return; |
| } else if (os == Linux) { |
| // These checks are kind of degenerated, but the check will not try to solve |
| // if logically all paths are covered, which is more the area of the static analyzer. |
| if (true) { |
| return; |
| } else if (false) { |
| // CHECK-MESSAGES: [[@LINE-1]]:12: warning: potentially uncovered codepath; add an ending else statement |
| return; |
| } |
| return; |
| } else { |
| /* unreachable */ |
| if (true) // check if the parent would match here as well |
| return; |
| // No warning for simple if statements, since it is common to just test one condition |
| // and ignore the opposite. |
| } |
| |
| // Ok, because all paths are covered |
| if (i > 0) { |
| return; |
| } else if (i < 0) { |
| return; |
| } else { |
| /* error, maybe precondition failed */ |
| } |
| } |