Skip to content

Commit a7f1dc0

Browse files
authored
[ADT] Use adl_being/end in concat (#130520)
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.
1 parent 483c23f commit a7f1dc0

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
@@ -1110,8 +1110,8 @@ class concat_iterator
11101110
/// We need the full range to know how to switch between each of the
11111111
/// iterators.
11121112
template <typename... RangeTs>
1113-
explicit concat_iterator(RangeTs &&... Ranges)
1114-
: Begins(std::begin(Ranges)...), Ends(std::end(Ranges)...) {}
1113+
explicit concat_iterator(RangeTs &&...Ranges)
1114+
: Begins(adl_begin(Ranges)...), Ends(adl_end(Ranges)...) {}
11151115

11161116
using BaseT::operator++;
11171117

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

11451145
private:
11461146
std::tuple<RangeTs...> Ranges;
11471147

1148-
template <size_t... Ns>
1149-
iterator begin_impl(std::index_sequence<Ns...>) {
1148+
template <size_t... Ns> iterator begin_impl(std::index_sequence<Ns...>) {
11501149
return iterator(std::get<Ns>(Ranges)...);
11511150
}
11521151
template <size_t... Ns>
11531152
iterator begin_impl(std::index_sequence<Ns...>) const {
11541153
return iterator(std::get<Ns>(Ranges)...);
11551154
}
11561155
template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) {
1157-
return iterator(make_range(std::end(std::get<Ns>(Ranges)),
1158-
std::end(std::get<Ns>(Ranges)))...);
1156+
return iterator(make_range(adl_end(std::get<Ns>(Ranges)),
1157+
adl_end(std::get<Ns>(Ranges)))...);
11591158
}
11601159
template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) const {
1161-
return iterator(make_range(std::end(std::get<Ns>(Ranges)),
1162-
std::end(std::get<Ns>(Ranges)))...);
1160+
return iterator(make_range(adl_end(std::get<Ns>(Ranges)),
1161+
adl_end(std::get<Ns>(Ranges)))...);
11631162
}
11641163

11651164
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)