From da5317acabf94e5c3c9579c222ce742a8d996c40 Mon Sep 17 00:00:00 2001 From: Jakub Kuderski Date: Sun, 9 Mar 2025 15:56:41 -0400 Subject: [PATCH] [ADT] Use `adl_being`/`end` in `map_range` 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. --- llvm/include/llvm/ADT/STLExtras.h | 3 +-- llvm/unittests/ADT/STLExtrasTest.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index ace5f60b572d7..97e41cc27e0a9 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -375,8 +375,7 @@ inline mapped_iterator map_iterator(ItTy I, FuncTy F) { template auto map_range(ContainerTy &&C, FuncTy F) { - return make_range(map_iterator(std::begin(C), F), - map_iterator(std::end(C), F)); + return make_range(map_iterator(adl_begin(C), F), map_iterator(adl_end(C), F)); } /// A base type of mapped iterator, that is useful for building derived diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp index 406ff2bc16073..5b1f4cdd7bdaf 100644 --- a/llvm/unittests/ADT/STLExtrasTest.cpp +++ b/llvm/unittests/ADT/STLExtrasTest.cpp @@ -730,6 +730,18 @@ TEST(STLExtrasTest, DropEndDefaultTest) { EXPECT_EQ(i, 4); } +TEST(STLExtrasTest, MapRangeTest) { + SmallVector Vec{0, 1, 2}; + EXPECT_THAT(map_range(Vec, [](int V) { return V + 1; }), + ElementsAre(1, 2, 3)); + + // Make sure that we use the `begin`/`end` functions + // from `some_namespace`, using ADL. + some_namespace::some_struct S; + S.data = {3, 4, 5}; + EXPECT_THAT(map_range(S, [](int V) { return V * 2; }), ElementsAre(6, 8, 10)); +} + TEST(STLExtrasTest, EarlyIncrementTest) { std::list L = {1, 2, 3, 4};