Compilation failures with range::v3 and nvc++/22.7

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

Hi Olli,

Thanks for the report. Looks like we may have this fixed already in the up coming 22.9 release.

Fails with 22.7:

% nvc++ -std=c++17 -Irange-v3/include range.cpp -w -c -V22.7
"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::allocator<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 8 of "range.cpp"
... cut ...

Ok with 22.9:

% nvc++ -std=c++17 -Irange-v3/include range.cpp -w -c -V22.9
%

22.9 should be releases here soon, so give it a try when it’s out.

-Mat

Hi Mat,

Great, thanks a lot for checking!

Cheers, Olli