[PATCH] D144503: [ADT] Allow `llvm::enumerate` to enumerate over multiple ranges
Jakub Kuderski via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 8 13:02:41 PST 2023
kuhar added a comment.
In D144503#4179026 <https://reviews.llvm.org/D144503#4179026>, @dblaikie wrote:
> I think it's the InputIterator (ForwardIterators must be InputIterators) requirement is the one that makes value returns not possible in practice because they're required to support `i->m` as being equivalent to (*i).m`, which isn't possible, as far as I recall/understand without backing storage to return a pointer to?
>
> Oh, and ForwardIterator also says (on cppreference):
>
> Let T be the value type of It. The type std::iterator_traits<It>::reference must be either
> T& or T&& (since C++11) if It satisfies LegacyOutputIterator (It is mutable), or
> const T& or const T&& (since C++11) otherwise (It is constant),
> (where T is the type denoted by std::iterator_traits<It>::value_type)
David and I talked offline and this interpretation of the standard is probably the correct one. To conform to the iterator requirements, we would have to store something like `std::optional<TupleOfReferences>` inside `zip_common` and materialize it on the first dereference. This would be a proper fix for all zip functions, but it doesn't seem like any part of llvm relies on `reference` being an actual reference right now, so it doesn't seem like a blocker.
I will update all uses of `for (auto &it : enumerate(...))` in a separate revision before landing this and leave a `FIXME` for the reference type issues.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D144503/new/
https://reviews.llvm.org/D144503
More information about the llvm-commits
mailing list