[PATCH] D112981: Fix iterator_adaptor_base/enumerator_iter to allow composition of llvm::enumerate with llvm::make_filter_range
River Riddle via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 1 23:48:29 PDT 2021
rriddle added a comment.
In D112981#3101944 <https://reviews.llvm.org/D112981#3101944>, @mehdi_amini wrote:
>> Can you update the description with information on what this is fixing?
>
> I am not sure how to phrase this, the first error was:
>
> /llvm/include/llvm/ADT/iterator.h:299:41: error: binding reference of type 'result_pair<...>' to value of type 'const result_pair<...>' drops 'const' qualifier
> ReferenceT operator*() const { return *I; }
> ^~
> llvm/unittests/ADT/IteratorTest.cpp:186:26: note: in instantiation of member function 'llvm::iterator_adaptor_base<llvm::filter_iterator_base<llvm::detail::enumerator_iter<int (&)[7]>, (lambda at llvm/unittests/ADT/IteratorTest.cpp:182:16), std::forward_iterator_tag>, llvm::detail::enumerator_iter<int (&)[7]>, std::forward_iterator_tag, llvm::detail::result_pair<int (&)[7]>, long, int *, llvm::detail::result_pair<int (&)[7]> &>::operator*' requested here
> for (auto IndexedValue : make_filter_range(Enumerate, IsOdd))
> ^
>
> The fix in STLExtra is for:
>
> llvm/unittests/ADT/IteratorTest.cpp:187:34: error: member reference base type 'int' is not a structure or union
> Actual.push_back(IndexedValue.value());
> ~~~~~~~~~~~~^~~~~~
> In file included from llvm/unittests/ADT/IteratorTest.cpp:10:
> llvm/include/llvm/ADT/iterator.h:300:35: error: non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'llvm::detail::enumerator_iter<int (&)[7]>::result_type' (aka 'result_pair<int (&)[7]>')
> ReferenceT operator*() { return *I; }
> ^~
> llvm/unittests/ADT/IteratorTest.cpp:186:26: note: in instantiation of member function 'llvm::iterator_adaptor_base<llvm::filter_iterator_base<llvm::detail::enumerator_iter<int (&)[7]>, (lambda at llvm/unittests/ADT/IteratorTest.cpp:182:16), std::forward_iterator_tag>, llvm::detail::enumerator_iter<int (&)[7]>, std::forward_iterator_tag, llvm::detail::result_pair<int (&)[7]>, long, int *, int &>::operator*' requested here
> for (auto IndexedValue : make_filter_range(Enumerate, IsOdd))
> ^
It was more of a passing comment, but something as simple as:
* Properly specify reference type in enumerator_iter
* Fix constness of iterator_adaptor_base::operator*
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112981/new/
https://reviews.llvm.org/D112981
More information about the llvm-commits
mailing list