diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp b/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp new file mode 100644 index 00000000000..34820b5fcc0 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/hicpp-multiway-paths-covered-else.cpp @@ -0,0 +1,57 @@ +// 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 */ + } +} |

