https://github.com/iamaayushrivastava updated 
https://github.com/llvm/llvm-project/pull/201231

>From 200bac8dba96dc076560c4887ca3d12917818915 Mon Sep 17 00:00:00 2001
From: Aayush Shrivastava <[email protected]>
Date: Wed, 3 Jun 2026 04:40:53 +0530
Subject: [PATCH 1/2] [clang-tidy] Extend readability-container-size-empty to
 std::size()

---
 .../readability/ContainerSizeEmptyCheck.cpp   | 13 +++++
 .../readability/container-size-empty.rst      | 14 +++---
 .../readability/container-size-empty.cpp      | 50 +++++++++++++++++++
 3 files changed, 70 insertions(+), 7 deletions(-)

diff --git 
a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
index cbad3d244d841..92ebd038610b6 100644
--- a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
@@ -208,6 +208,19 @@ void ContainerSizeEmptyCheck::registerMatchers(MatchFinder 
*Finder) {
           .bind("SizeCallExpr"),
       this);
 
+  // Match non-member std::size(container) used in boolean context or compared
+  // with 0/1.
+  Finder->addMatcher(
+      callExpr(argumentCountIs(1),
+               callee(functionDecl(hasName("::std::size")).bind("SizeMethod")),
+               hasArgument(0, expr(anyOf(hasType(ValidContainer),
+                                         hasType(pointsTo(ValidContainer)),
+                                         hasType(references(ValidContainer))))
+                                  .bind("MemberCallObject")),
+               WrongUse, NotInEmptyMethodOfContainer)
+          .bind("SizeCallExpr"),
+      this);
+
   // Comparison to empty string or empty constructor.
   const auto WrongComparend =
       anyOf(stringLiteral(hasSize(0)),
diff --git 
a/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst 
b/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst
index cc012fdcd7649..70b05f498d804 100644
--- 
a/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst
+++ 
b/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst
@@ -4,15 +4,15 @@ readability-container-size-empty
 ================================
 
 
-Checks whether a call to the ``size()``/``length()`` method can be replaced
-with a call to ``empty()``.
+Checks whether a call to the ``size()``/``length()`` method or the
+``std::size()`` free function can be replaced with a call to ``empty()``.
 
 The emptiness of a container should be checked using the ``empty()`` method
-instead of the ``size()``/``length()`` method. It shows clearer intent to use
-``empty()``. Furthermore some containers (for example, a ``std::forward_list``)
-may implement the ``empty()`` method but not implement the ``size()`` or
-``length()`` method. Using ``empty()`` whenever possible makes it easier to
-switch to another container in the future.
+instead of the ``size()``/``length()`` method or ``std::size()``. It shows
+clearer intent to use ``empty()``. Furthermore some containers (for example, a
+``std::forward_list``) may implement the ``empty()`` method but not implement
+the ``size()`` or ``length()`` method. Using ``empty()`` whenever possible
+makes it easier to switch to another container in the future.
 
 The check issues warning if a container has ``empty()`` and ``size()`` or
 ``length()`` methods matching following signatures:
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 cd2eebb16138b..9edca775a73d9 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
@@ -27,6 +27,12 @@ namespace string_literals{
 string operator""s(const char *, size_t);
 }
 
+template <class C>
+auto size(const C& c) -> decltype(c.size());
+
+template <class C>
+auto empty(const C& c) -> decltype(c.empty());
+
 }
 
 template <typename T>
@@ -924,6 +930,50 @@ class ReportInTemplateContainerNonEmptyMethod {
   }
 };
 
+namespace GH198494 {
+
+void testStdSize(const std::string &str, std::vector<int> vect) {
+  if (std::size(vect))
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (!vect.empty())
+
+  if (!std::size(vect))
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:8: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (vect.empty())
+
+  if (std::size(vect) == 0)
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (vect.empty())
+
+  if (std::size(vect) != 0)
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (!vect.empty())
+
+  if (std::size(vect) > 0)
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (!vect.empty())
+
+  if (std::size(str))
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (!str.empty())
+
+  if (std::size(str) == 0)
+    ;
+  // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be 
used to check for emptiness instead of 'size' [readability-container-size-empty]
+  // CHECK-FIXES: if (str.empty())
+
+  // No warning when std::empty is already used.
+  if (std::empty(vect)) {}
+}
+
+} // namespace GH198494
+
 
 
 class ReportInContainerNonEmptyMethodCompare {

>From 95e6cf68a0359280254e48248967c03d181e3578 Mon Sep 17 00:00:00 2001
From: Aayush Shrivastava <[email protected]>
Date: Wed, 3 Jun 2026 05:18:53 +0530
Subject: [PATCH 2/2] [clang-tidy] Fix diagnostic message for std::size()
 template specialization

---
 .../clang-tidy/readability/ContainerSizeEmptyCheck.cpp          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git 
a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
index 92ebd038610b6..08deaf40f62c7 100644
--- a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
@@ -419,7 +419,7 @@ void ContainerSizeEmptyCheck::check(const 
MatchFinder::MatchResult &Result) {
                               "for emptiness instead of %0");
     if (const auto *SizeMethod =
             Result.Nodes.getNodeAs<NamedDecl>("SizeMethod"))
-      Diag << SizeMethod;
+      Diag << SizeMethod->getDeclName();
     else if (const auto *DependentExpr =
                  Result.Nodes.getNodeAs<CXXDependentScopeMemberExpr>(
                      "MemberExpr"))

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to