diff --git a/clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp b/clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp --- a/clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp @@ -104,7 +104,8 @@ } 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( compoundStmt(has(stmt(anyOf(ifStmt(), forStmt(), whileStmt())))) .bind("compound"), diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -240,6 +240,10 @@ magic numbers in type aliases such as ``using`` and ``typedef`` declarations if the new ``IgnoreTypeAliases`` option is set to true. +- Fixed a false positive in :doc:`readability-misleading-indentation + ` check when warning would + be unnecessarily emitted for template dependent ``if constexpr``. + - Fixed a false positive in :doc:`cppcoreguidelines-slicing ` check when warning would be emitted in constructor for virtual base class initialization. diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation-cpp17.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation-cpp17.cpp new file mode 100644 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation-cpp17.cpp @@ -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 +constexpr auto lam_correct = []{ + if constexpr (N == 1) { + } else { + } +}; + +template +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>(); +} + +}