diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -646,13 +646,13 @@ } template - decltype(iterators) tup_inc(std::index_sequence) const { - return std::tuple(std::next(std::get(iterators))...); + void tup_inc(std::index_sequence) { + (++std::get(iterators), ...); } template - decltype(iterators) tup_dec(std::index_sequence) const { - return std::tuple(std::prev(std::get(iterators))...); + void tup_dec(std::index_sequence) { + (--std::get(iterators), ...); } template @@ -671,14 +671,14 @@ } ZipType &operator++() { - iterators = tup_inc(std::index_sequence_for{}); + tup_inc(std::index_sequence_for{}); return *reinterpret_cast(this); } ZipType &operator--() { static_assert(Base::IsBidirectional, "All inner iterators must be at least bidirectional."); - iterators = tup_dec(std::index_sequence_for{}); + tup_dec(std::index_sequence_for{}); return *reinterpret_cast(this); } @@ -769,10 +769,9 @@ namespace detail { template -Iter next_or_end(const Iter &I, const Iter &End) { - if (I == End) - return End; - return std::next(I); +void increment_or_end(Iter &I, const Iter &End) { + if (I != End) + ++I; } template @@ -826,9 +825,8 @@ } template - decltype(iterators) tup_inc(std::index_sequence) const { - return std::tuple( - next_or_end(std::get(iterators), std::get(end_iterators))...); + void tup_inc(std::index_sequence) const { + (increment_or_end(std::get(iterators), std::get(end_iterators)), ...); } public: @@ -841,7 +839,7 @@ } zip_longest_iterator &operator++() { - iterators = tup_inc(std::index_sequence_for{}); + tup_inc(std::index_sequence_for{}); return *this; }