[clang-tools-extra] e329bfc - [clang-tidy] Ignore implicit functions in readability-implicit-bool-conversion (#94512)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jun 9 02:52:50 PDT 2024
Author: Piotr Zegar
Date: 2024-06-09T11:52:46+02:00
New Revision: e329bfcb033910fc340b6da5a6307003ac6b2b01
URL: https://github.com/llvm/llvm-project/commit/e329bfcb033910fc340b6da5a6307003ac6b2b01
DIFF: https://github.com/llvm/llvm-project/commit/e329bfcb033910fc340b6da5a6307003ac6b2b01.diff
LOG: [clang-tidy] Ignore implicit functions in readability-implicit-bool-conversion (#94512)
Ignore implicit declarations and defaulted functions. Helps with issues
in generated code like, C++
spaceship operator.
Closes #93409
Added:
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-cxx20.cpp
Modified:
clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 28f5eada6d825..aa115cd450c4f 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -279,6 +279,9 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
hasParent(callExpr()),
hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
+ auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
+ isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
+
Finder->addMatcher(
traverse(TK_AsIs,
implicitCastExpr(
@@ -299,7 +302,7 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
// additional parens in replacement.
optionally(hasParent(stmt().bind("parentStmt"))),
unless(isInTemplateInstantiation()),
- unless(hasAncestor(functionTemplateDecl())))
+ unless(IsInCompilerGeneratedFunction))
.bind("implicitCastToBool")),
this);
@@ -331,7 +334,7 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
anything()),
unless(isInTemplateInstantiation()),
- unless(hasAncestor(functionTemplateDecl())))),
+ unless(IsInCompilerGeneratedFunction))),
this);
}
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 277a6e75da2ac..0b03e37fc2b2c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -408,7 +408,8 @@ Changes in existing checks
valid fix suggestions for ``static_cast`` without a preceding space and
fixed problem with duplicate parentheses in double implicit casts. Corrected
the fix suggestions for C23 and later by using C-style casts instead of
- ``static_cast``.
+ ``static_cast``. Fixed false positives in C++20 spaceship operator by ignoring
+ casts in implicit and defaulted functions.
- Improved :doc:`readability-redundant-inline-specifier
<clang-tidy/checks/readability/redundant-inline-specifier>` check to properly
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-cxx20.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-cxx20.cpp
new file mode 100644
index 0000000000000..13aa5c5774b47
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-cxx20.cpp
@@ -0,0 +1,31 @@
+// RUN: %check_clang_tidy -std=c++20 %s readability-implicit-bool-conversion %t
+
+namespace std {
+struct strong_ordering {
+ int n;
+ constexpr operator int() const { return n; }
+ static const strong_ordering equal, greater, less;
+};
+constexpr strong_ordering strong_ordering::equal = {0};
+constexpr strong_ordering strong_ordering::greater = {1};
+constexpr strong_ordering strong_ordering::less = {-1};
+} // namespace std
+
+namespace PR93409 {
+ struct X
+ {
+ auto operator<=>(const X&) const = default;
+ bool m_b;
+ };
+
+ struct Y
+ {
+ auto operator<=>(const Y&) const = default;
+ X m_x;
+ };
+
+ bool compare(const Y& y1, const Y& y2)
+ {
+ return y1 == y2 || y1 < y2 || y1 > y2;
+ }
+}
More information about the cfe-commits
mailing list