blob: 1ccc52d81f8a032a12f156e072d916063be90ed9 [file] [log] [blame]
// { dg-do compile { target c++20 } }
// LWG 3589. The const lvalue reference overload of get for subrange does not
// constrain I to be copyable when N == 0
#include <ranges>
#include <testsuite_iterators.h>
void
test_lwg3589()
{
int a[2]{};
__gnu_test::test_range<int, __gnu_test::input_iterator_wrapper_nocopy> r(a);
// Use a generic lambda so we have a dependent context.
auto test = [](auto& x)
{
// This was wrong before the LWG 3589 change:
if constexpr (requires { std::ranges::get<0>(x); })
(void) std::ranges::get<0>(x);
// These always worked unconditionally:
(void) std::ranges::get<1>(x);
(void) std::ranges::get<0>(std::move(x));
(void) std::ranges::get<1>(std::move(x));
};
std::ranges::subrange sr(r.begin(), r.end());
test(sr);
}