Author: Fabian Wolff Date: 2022-04-20T17:03:30+02:00 New Revision: fb3b3f76bf75875684eedfe0711424e7ceba4b41
URL: https://github.com/llvm/llvm-project/commit/fb3b3f76bf75875684eedfe0711424e7ceba4b41 DIFF: https://github.com/llvm/llvm-project/commit/fb3b3f76bf75875684eedfe0711424e7ceba4b41.diff LOG: [clang-tidy] Fix `readability-container-size-empty` check for smart pointers Fixes https://github.com/llvm/llvm-project/issues/51118. Reviewed By: Sockke Differential Revision: https://reviews.llvm.org/D115124 Added: Modified: 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 Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp index d399c957c7c73..cc7a6834e3b6e 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp @@ -191,10 +191,17 @@ void ContainerSizeEmptyCheck::check(const MatchFinder::MatchResult &Result) { 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()"; diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 491bc92f4ef38..541ff89c14803 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -173,6 +173,9 @@ Changes in existing checks - 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 ^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp index 31dccd20427e2..0759e0308e91a 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability-container-size-empty.cpp @@ -696,3 +696,25 @@ void instantiator() { 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(); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits