[PATCH] D95714: clang-tidy: modernize-use-nullptr mistakenly fixes rewritten spaceship operator comparisons
Conrad Poelman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 29 23:48:40 PST 2021
poelmanc updated this revision to Diff 320286.
poelmanc added a comment.
Fix test failure in `modernize-use-nullptr-cxx20.cpp` by replacing `#include <compare>` with some minimal equivalent `std` code.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95714/new/
https://reviews.llvm.org/D95714
Files:
clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
clang-tools-extra/test/clang-tidy/checkers/modernize-use-nullptr-cxx20.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/modernize-use-nullptr-cxx20.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/modernize-use-nullptr-cxx20.cpp
@@ -0,0 +1,48 @@
+// RUN: %check_clang_tidy -std=c++20 %s modernize-use-nullptr %t
+
+// Not all systems have #include <compare> to define std::std_ordering
+// required by operator<=>, so recreate minimal version for tests below.
+namespace std {
+
+struct strong_ordering {
+ static const strong_ordering less;
+ static const strong_ordering equal;
+ static const strong_ordering greater;
+ using zero_type = decltype(nullptr);
+
+ friend constexpr bool operator<(const strong_ordering value, zero_type) noexcept {
+ return value.comparison_value < 0;
+ }
+
+ friend constexpr bool operator>(const strong_ordering value, zero_type) noexcept {
+ return value.comparison_value > 0;
+ }
+
+ friend constexpr bool operator>=(const strong_ordering value, zero_type) noexcept {
+ return value.comparison_value >= 0;
+ }
+
+ signed char comparison_value;
+};
+
+inline constexpr strong_ordering strong_ordering::less{-1};
+inline constexpr strong_ordering strong_ordering::equal{0};
+inline constexpr strong_ordering strong_ordering::greater{1};
+
+} // namespace std
+
+class A {
+public:
+ auto operator<=>(const A &other) const = default;
+};
+
+void test_cxx_rewritten_binary_ops() {
+ A a1, a2;
+ bool result;
+ // should not change next line to (a1 nullptr a2)
+ result = (a1 < a2);
+ // CHECK-FIXES: result = (a1 < a2);
+ // should not change next line to (a1 nullptr a2)
+ result = (a1 >= a2);
+ // CHECK-FIXES: result = (a1 >= a2);
+}
Index: clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
@@ -45,6 +45,8 @@
TK_AsIs,
castExpr(anyOf(ImplicitCastToNull,
explicitCastExpr(hasDescendant(ImplicitCastToNull))),
+ // Skip implicit casts to 0 generated by operator<=> rewrites.
+ unless(hasAncestor(cxxRewrittenBinaryOperator())),
unless(hasAncestor(explicitCastExpr())))
.bind(CastSequence));
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95714.320286.patch
Type: text/x-patch
Size: 2362 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210130/1e7ddbca/attachment-0001.bin>
More information about the cfe-commits
mailing list