[PATCH] D115124: [clang-tidy] Fix `readability-container-size-empty` check for smart pointers
Fabian Wolff via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 20 08:07:01 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rGfb3b3f76bf75: [clang-tidy] Fix `readability-container-size-empty` check for smart pointers (authored by fwolff).
Herald added a project: All.
Changed prior to commit:
https://reviews.llvm.org/D115124?vs=400625&id=423909#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D115124/new/
https://reviews.llvm.org/D115124
Files:
clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp
@@ -696,3 +696,25 @@
instantiatedTemplateWithSizeCall<TypeWithSize>();
instantiatedTemplateWithSizeCall<std::vector<int>>();
}
+
+namespace std {
+template <typename T>
+struct unique_ptr {
+ T *operator->() const;
+ T &operator*() const;
+};
+} // namespace std
+
+bool call_through_unique_ptr(const std::unique_ptr<std::vector<int>> &ptr) {
+ return ptr->size() > 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: the 'empty' method should be used
+ // CHECK-MESSAGES: :9:8: note: method 'vector'::empty() defined here
+ // CHECK-FIXES: {{^ }}return !ptr->empty();
+}
+
+bool call_through_unique_ptr_deref(const std::unique_ptr<std::vector<int>> &ptr) {
+ return (*ptr).size() > 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: the 'empty' method should be used
+ // CHECK-MESSAGES: :9:8: note: method 'vector'::empty() defined here
+ // CHECK-FIXES: {{^ }}return !(*ptr).empty();
+}
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -173,6 +173,9 @@
- Fixed nonsensical suggestion of :doc:`altera-struct-pack-align
<clang-tidy/checks/altera-struct-pack-align>` check for empty structs.
+- Fixed incorrect suggestions for :doc:`readability-container-size-empty
+ <clang-tidy/checks/readability-container-size-empty>` when smart pointers are involved.
+
Removed checks
^^^^^^^^^^^^^^
Index: clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
@@ -191,10 +191,17 @@
std::string ReplacementText = std::string(
Lexer::getSourceText(CharSourceRange::getTokenRange(E->getSourceRange()),
*Result.SourceManager, getLangOpts()));
- if (isBinaryOrTernary(E) || isa<UnaryOperator>(E)) {
+ const auto *OpCallExpr = dyn_cast<CXXOperatorCallExpr>(E);
+ if (isBinaryOrTernary(E) || isa<UnaryOperator>(E) ||
+ (OpCallExpr && (OpCallExpr->getOperator() == OO_Star))) {
ReplacementText = "(" + ReplacementText + ")";
}
- if (E->getType()->isPointerType())
+ if (OpCallExpr &&
+ OpCallExpr->getOperator() == OverloadedOperatorKind::OO_Arrow) {
+ // This can happen if the object is a smart pointer. Don't add anything
+ // because a '->' is already there (PR#51776), just call the method.
+ ReplacementText += "empty()";
+ } else if (E->getType()->isPointerType())
ReplacementText += "->empty()";
else
ReplacementText += ".empty()";
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D115124.423909.patch
Type: text/x-patch
Size: 3041 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220420/604a95f9/attachment-0001.bin>
More information about the cfe-commits
mailing list