[llvm] 9764659 - [ADT] Use `adl_being`/`end` in `hasSingleElement` (#130506)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 9 14:08:12 PDT 2025
Author: Jakub Kuderski
Date: 2025-03-09T17:08:08-04:00
New Revision: 9764659fb4ae8b3ecaa8e462dde94b742d113b93
URL: https://github.com/llvm/llvm-project/commit/9764659fb4ae8b3ecaa8e462dde94b742d113b93
DIFF: https://github.com/llvm/llvm-project/commit/9764659fb4ae8b3ecaa8e462dde94b742d113b93.diff
LOG: [ADT] Use `adl_being`/`end` in `hasSingleElement` (#130506)
This is to make sure that ADT helpers consistently use argument
dependent lookup when dealing with input ranges.
This was a part of #87936 but reverted due to buildbot failures. Now
that I have a threadripper system, I'm landing this piece-by-piece.
Added:
Modified:
llvm/include/llvm/ADT/STLExtras.h
llvm/unittests/ADT/STLExtrasTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h
index ace5f60b572d7..fe1d010574e31 100644
--- a/llvm/include/llvm/ADT/STLExtras.h
+++ b/llvm/include/llvm/ADT/STLExtras.h
@@ -320,7 +320,8 @@ template <typename T> class Callable<T, true> {
/// Returns true if the given container only contains a single element.
template <typename ContainerTy> bool hasSingleElement(ContainerTy &&C) {
- auto B = std::begin(C), E = std::end(C);
+ auto B = adl_begin(C);
+ auto E = adl_end(C);
return B != E && std::next(B) == E;
}
diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp
index 406ff2bc16073..e107cb570641b 100644
--- a/llvm/unittests/ADT/STLExtrasTest.cpp
+++ b/llvm/unittests/ADT/STLExtrasTest.cpp
@@ -934,10 +934,19 @@ TEST(STLExtrasTest, hasSingleElement) {
const std::vector<int> V0 = {}, V1 = {1}, V2 = {1, 2};
const std::vector<int> V10(10);
- EXPECT_EQ(hasSingleElement(V0), false);
- EXPECT_EQ(hasSingleElement(V1), true);
- EXPECT_EQ(hasSingleElement(V2), false);
- EXPECT_EQ(hasSingleElement(V10), false);
+ EXPECT_FALSE(hasSingleElement(V0));
+ EXPECT_TRUE(hasSingleElement(V1));
+ EXPECT_FALSE(hasSingleElement(V2));
+ EXPECT_FALSE(hasSingleElement(V10));
+
+ // Make sure that we use the `begin`/`end` functions
+ // from `some_namespace`, using ADL.
+ some_namespace::some_struct S;
+ EXPECT_FALSE(hasSingleElement(S));
+ S.data = V1;
+ EXPECT_TRUE(hasSingleElement(S));
+ S.data = V2;
+ EXPECT_FALSE(hasSingleElement(S));
}
TEST(STLExtrasTest, hasNItems) {
More information about the llvm-commits
mailing list