[clang-tidy] Fix if-constexpr false-positive in readability-misleading-indentation

When  depend on template parameter,
compiler can use NullStmt instead of CompoundStmt.
This causes issues as we losing information about
end location of that Stmt. To avoid this issue
check now ignores ifStmt with NullStmt on true-branch.

Fixes: https://github.com/llvm/llvm-project/issues/61435

Reviewed By: carlosgalvezp

Differential Revision: https://reviews.llvm.org/D146887
This commit is contained in:
Piotr Zegar 2023-03-29 15:24:54 +00:00
parent 270067d695
commit 498c88563b
3 changed files with 35 additions and 1 deletions

View File

@ -104,7 +104,8 @@ void MisleadingIndentationCheck::missingBracesCheck(const SourceManager &SM,
} }
void MisleadingIndentationCheck::registerMatchers(MatchFinder *Finder) { void MisleadingIndentationCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(ifStmt(hasElse(stmt())).bind("if"), this); Finder->addMatcher(
ifStmt(unless(hasThen(nullStmt())), hasElse(stmt())).bind("if"), this);
Finder->addMatcher( Finder->addMatcher(
compoundStmt(has(stmt(anyOf(ifStmt(), forStmt(), whileStmt())))) compoundStmt(has(stmt(anyOf(ifStmt(), forStmt(), whileStmt()))))
.bind("compound"), .bind("compound"),

View File

@ -240,6 +240,10 @@ Changes in existing checks
magic numbers in type aliases such as ``using`` and ``typedef`` declarations if magic numbers in type aliases such as ``using`` and ``typedef`` declarations if
the new ``IgnoreTypeAliases`` option is set to true. the new ``IgnoreTypeAliases`` option is set to true.
- Fixed a false positive in :doc:`readability-misleading-indentation
<clang-tidy/checks/readability/misleading-indentation>` check when warning would
be unnecessarily emitted for template dependent ``if constexpr``.
- Fixed a false positive in :doc:`cppcoreguidelines-slicing - Fixed a false positive in :doc:`cppcoreguidelines-slicing
<clang-tidy/checks/cppcoreguidelines/slicing>` check when warning would be <clang-tidy/checks/cppcoreguidelines/slicing>` check when warning would be
emitted in constructor for virtual base class initialization. emitted in constructor for virtual base class initialization.

View File

@ -0,0 +1,29 @@
// RUN: %check_clang_tidy -std=c++17-or-later %s readability-misleading-indentation %t -- -- -fno-delayed-template-parsing
namespace PR61435 {
template<int N>
constexpr auto lam_correct = []{
if constexpr (N == 1) {
} else {
}
};
template<int N>
constexpr auto lam_incorrect = []{
if constexpr (N == 1) {
}
else {
}
// CHECK-MESSAGES: :[[@LINE-2]]:4: warning: different indentation for 'if' and corresponding 'else' [readability-misleading-indentation]
};
void test() {
lam_correct<1>();
lam_correct<2>();
lam_incorrect<1>();
lam_incorrect<2>();
}
}