[clang-tidy] Disable match on `if constexpr` statements in template instantiation for `readability-misleading-indentation` check.

Summary: Fixes fixes `readability-misleading-identation` for `if constexpr`. This is very similar to D71980.

Reviewers: alexfh

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D72333
This commit is contained in:
Andi-Bogdan Postelnicu 2020-01-07 11:44:15 +02:00
parent 8e2b44f7e0
commit ba129c7d0f
2 changed files with 82 additions and 1 deletions

View File

@ -106,7 +106,11 @@ void MisleadingIndentationCheck::missingBracesCheck(const SourceManager &SM,
}
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"),

View File

@ -2,6 +2,7 @@
void foo1();
void foo2();
void foo3();
#define BLOCK \
if (cond1) \
@ -118,3 +119,79 @@ void g(bool x) {
#pragma unroll
for (int k = 0; k < 1; ++k) {}
}
template<bool b>
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<bool b>
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<bool b>
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<bool b>
void mustPassNoInsta() {
if constexpr (b) {
foo1();
}
else {
foo2();
}
}
void call() {
mustPass<true>();
mustPass<false>();
mustFail<true>();
mustFail<false>();
}