PiotrZSL created this revision. Herald added subscribers: carlosgalvezp, xazax.hun. Herald added a reviewer: njames93. Herald added a project: All. PiotrZSL requested review of this revision. Herald added a project: clang-tools-extra. Herald added a subscriber: cfe-commits.
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 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D146887 Files: clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp Index: clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp +++ 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<true>(); mustFail<false>(); } + +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>(); +} + +} Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ 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 + <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. Index: clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp +++ 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"),
Index: clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability/misleading-indentation.cpp +++ 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<true>(); mustFail<false>(); } + +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>(); +} + +} Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ 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 + <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. Index: clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/MisleadingIndentationCheck.cpp +++ 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"),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits