Hello,
We have been trying to use range::v3
in a host-only part of our application. We use OpenACC/OpenMP target offload elsewhere in the application, and in GPU-enabled builds we prefer to build the entire project using nvc++
for simplicity and consistency.
Unfortunately we have issues with some range::v3
code. For example, the following example:
#include <range/v3/algorithm/rotate.hpp>
#include <range/v3/view/zip.hpp>
#include <vector>
void rotate(std::vector<float>& foo, std::size_t i) {
auto zip = ranges::views::zip(foo);
ranges::rotate(ranges::begin(zip),
ranges::next(ranges::begin(zip), i),
ranges::end(zip));
}
builds fine with GCC, Clang, MSVC and ICX (Compiler Explorer) but fails with nvc++/22.7
(and ICC, which may be related to Error log when using Intel's C++ compiler · Issue #1396 · ericniebler/range-v3 · GitHub – the issue also mentions nvc++
):
$ nvc++ -std=c++17 -Irange-v3/include test.cpp -Wall
"range-v3/include/range/v3/algorithm/rotate.hpp", line 54: error: "iter_move" is ambiguous
iter_value_t<I> tmp = iter_move(first);
^
detected during:
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/algorithm/move.hpp", line 49: error: "iter_move" is ambiguous
*out = iter_move(first);
^
detected during:
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_left(I, I) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>]"
at line 186 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor
<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/algorithm/rotate.hpp", line 64: error: "iter_move" is ambiguous
iter_value_t<I> tmp = iter_move(lm1);
^
detected during:
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor
<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/algorithm/move_backward.hpp", line 49: error: "iter_move" is ambiguous
*--out = iter_move(--i);
^
detected during:
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_right(I, I) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>]"
at line 188 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor
<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/algorithm/rotate.hpp", line 129: error: "iter_move" is ambiguous
iter_value_t<I> t = iter_move(--p);
^
detected during:
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor
<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/algorithm/rotate.hpp", line 134: error: "iter_move" is ambiguous
*p1 = iter_move(p2);
^
detected during:
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor
<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/iterator/access.hpp", line 231: warning: missing return statement at end of non-void function "ranges::_iter_swap_::fn::operator()(I0 &&, I1 &&) const"
}
^
detected during:
instantiation of "ranges::swap_ranges_result<I1, I2> ranges::swap_ranges_fn::operator()(I1, S1, I2) const [with I1=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>:
:cursor<false>>, S1=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, I2=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ran
ges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0, <unnamed>=0, <unnamed>=0]" at line 123 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_gcd(I, I, I) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>]
" at line 189 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::detail::rotate_(I, I, I, std::random_access_iterator_tag) [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::alloca
tor<float>>>>::cursor<false>>]" at line 212 of "range-v3/include/range/v3/algorithm/rotate.hpp"
instantiation of "ranges::subrange<I, I, <expression>> ranges::rotate_fn::operator()(I, I, S) const [with I=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor
<false>>, S=ranges::basic_iterator<ranges::iter_zip_with_view<ranges::detail::indirect_zip_fn_, ranges::ref_view<std::vector<float, std::allocator<float>>>>::cursor<false>>, CPP_true=true, <unnamed>=0, <unnamed>=0]" at line 6 of "test.cpp"
"range-v3/include/range/v3/view/zip_with.hpp", line 268: warning: missing return statement at end of non-void function "ranges::iter_zip_with_view<Fun, Rngs...>::cursor<Const>::prev()->concepts::return_t<void, std::enable_if_t<<expression>, void>>"
}
^
"range-v3/include/range/v3/view/zip_with.hpp", line 275: warning: missing return statement at end of non-void function "ranges::iter_zip_with_view<Fun, Rngs...>::cursor<Const>::advance(ranges::iter_zip_with_view<Fun, Rngs...>::cursor<Const>::difference_type)->concepts::re
turn_t<void, std::enable_if_t<<expression>, void>>"
}
^
6 errors detected in the compilation of "test.cpp".
I used the latest release of range::v3
from GitHub, 0.12.0. I also came across Visual Studio Feedback, which appears to be the report of the same (now fixed) issue in MSVC. It would be great if this could also be fixed in nvc++
!
Thanks, Olli