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 @@ -106,7 +106,11 @@ } void MisleadingIndentationCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher(ifStmt(hasElse(stmt())).bind("if"), this); + Finder->addMatcher( + ifStmt(allOf(hasElse(stmt()), + unless(allOf(isConstexpr(), isInTemplateInstantiation())))) + .bind("if"), + this); Finder->addMatcher( compoundStmt(has(stmt(anyOf(ifStmt(), forStmt(), whileStmt())))) .bind("compound"), 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 @@ -2,6 +2,7 @@ void foo1(); void foo2(); +void foo3(); #define BLOCK \ if (cond1) \ @@ -118,3 +119,79 @@ #pragma unroll for (int k = 0; k < 1; ++k) {} } + +template +void mustPass() { + if constexpr (b) { + foo1(); + } else { + foo2(); + } +} + +void mustPassNonTemplate() { + constexpr unsigned Value = 1; + if constexpr (Value == 0) { + foo1(); + } else if constexpr (Value == 1) { + foo2(); + } else { + foo3(); + } +} + +template +void mustFail() { + if constexpr (b) { + foo1(); + } + else { + foo2(); + // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: different indentation for 'if' and corresponding 'else' [readability-misleading-indentation] + } +} + +void mustFailNonTemplate() { + constexpr unsigned Value = 1; + if constexpr (Value == 0) { + foo1(); + } + else { + foo2(); + // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: different indentation for 'if' and corresponding 'else' [readability-misleading-indentation] + } + + if constexpr (Value == 0) + foo1(); + else + foo2(); + // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: different indentation for 'if' and corresponding 'else' [readability-misleading-indentation] +} + +template +void mustFailNoInsta() { + if constexpr (b) { + foo1(); + } + else { + foo2(); + // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: different indentation for 'if' and corresponding 'else' [readability-misleading-indentation] + } +} + +template +void mustPassNoInsta() { + if constexpr (b) { + foo1(); + } + else { + foo2(); + } +} + +void call() { + mustPass(); + mustPass(); + mustFail(); + mustFail(); +}