Skip to content

Commit 27ddb00

Browse files
committed
[ADT] Use adl_being/end in concat
This is to make sure that ADT helpers consistently use argument dependent lookup when dealing with input ranges. This was a part of llvm#87936 but reverted due to buildbot failures.
1 parent 9764659 commit 27ddb00

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

llvm/include/llvm/ADT/STLExtras.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,8 +1112,8 @@ class concat_iterator
11121112
/// We need the full range to know how to switch between each of the
11131113
/// iterators.
11141114
template <typename... RangeTs>
1115-
explicit concat_iterator(RangeTs &&... Ranges)
1116-
: Begins(std::begin(Ranges)...), Ends(std::end(Ranges)...) {}
1115+
explicit concat_iterator(RangeTs &&...Ranges)
1116+
: Begins(adl_begin(Ranges)...), Ends(adl_end(Ranges)...) {}
11171117

11181118
using BaseT::operator++;
11191119

@@ -1142,26 +1142,25 @@ template <typename ValueT, typename... RangeTs> class concat_range {
11421142
public:
11431143
using iterator =
11441144
concat_iterator<ValueT,
1145-
decltype(std::begin(std::declval<RangeTs &>()))...>;
1145+
decltype(adl_begin(std::declval<RangeTs &>()))...>;
11461146

11471147
private:
11481148
std::tuple<RangeTs...> Ranges;
11491149

1150-
template <size_t... Ns>
1151-
iterator begin_impl(std::index_sequence<Ns...>) {
1150+
template <size_t... Ns> iterator begin_impl(std::index_sequence<Ns...>) {
11521151
return iterator(std::get<Ns>(Ranges)...);
11531152
}
11541153
template <size_t... Ns>
11551154
iterator begin_impl(std::index_sequence<Ns...>) const {
11561155
return iterator(std::get<Ns>(Ranges)...);
11571156
}
11581157
template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) {
1159-
return iterator(make_range(std::end(std::get<Ns>(Ranges)),
1160-
std::end(std::get<Ns>(Ranges)))...);
1158+
return iterator(make_range(adl_end(std::get<Ns>(Ranges)),
1159+
adl_end(std::get<Ns>(Ranges)))...);
11611160
}
11621161
template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) const {
1163-
return iterator(make_range(std::end(std::get<Ns>(Ranges)),
1164-
std::end(std::get<Ns>(Ranges)))...);
1162+
return iterator(make_range(adl_end(std::get<Ns>(Ranges)),
1163+
adl_end(std::get<Ns>(Ranges)))...);
11651164
}
11661165

11671166
public:

llvm/unittests/ADT/STLExtrasTest.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,16 @@ TEST(STLExtrasTest, ConcatRange) {
504504
EXPECT_EQ(Expected, Test);
505505
}
506506

507+
TEST(STLExtrasTest, ConcatRangeADL) {
508+
// Make sure that we use the `begin`/`end` functions from `some_namespace`,
509+
// using ADL.
510+
some_namespace::some_struct S0;
511+
S0.data = {1, 2};
512+
some_namespace::some_struct S1;
513+
S1.data = {3, 4};
514+
EXPECT_THAT(concat<const int>(S0, S1), ElementsAre(1, 2, 3, 4));
515+
}
516+
507517
template <typename T> struct Iterator {
508518
int i = 0;
509519
T operator*() const { return i; }

0 commit comments

Comments
 (0)