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 @@ -225,6 +225,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.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s readability-misleading-indentation %t -- -- -fno-delayed-template-parsing +// RUN: %check_clang_tidy -std=c++17-or-later %s readability-misleading-indentation %t -- -- -fno-delayed-template-parsing void foo1(); void foo2(); @@ -195,3 +195,31 @@ mustFail(); mustFail(); } + +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>(); +} + +}