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
}
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"),
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
+ <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
<clang-tidy/checks/cppcoreguidelines/slicing>` check when warning would be
emitted in constructor for virtual base class initialization.
--- /dev/null
+// 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>();
+}
+
+}