libstdc++: Implement LWG 3481 change to ranges::viewable_range

libstdc++-v3/ChangeLog:

	* include/bits/ranges_base.h (viewable_range): Adjust as per
	LWG 3481.
	* testsuite/std/ranges/adaptors/all.cc (test07): New test.
This commit is contained in:
Patrick Palka 2021-10-20 21:34:18 -04:00
parent 0fac85a24f
commit a2c2dcc6ca
2 changed files with 17 additions and 1 deletions

View file

@ -688,7 +688,8 @@ namespace ranges
/// A range which can be safely converted to a view.
template<typename _Tp>
concept viewable_range = range<_Tp>
&& (borrowed_range<_Tp> || view<remove_cvref_t<_Tp>>);
&& ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>)
|| (!view<remove_cvref_t<_Tp>> && borrowed_range<_Tp>));
// [range.iter.ops] range iterator operations

View file

@ -159,6 +159,20 @@ test06()
static_assert(!noexcept(views::all(BorrowedRange<false, false>(x))));
}
void
test07()
{
// LWG 3481
struct view_t : ranges::empty_view<int> { // move-only view
view_t(const view_t&) = delete;
view_t(view_t&&) = default;
view_t& operator=(const view_t&) = delete;
view_t& operator=(view_t&&) = default;
};
static_assert(std::movable<view_t> && !std::copyable<view_t>);
static_assert(!ranges::viewable_range<view_t&>);
}
int
main()
{
@ -168,4 +182,5 @@ main()
static_assert(test04());
test05();
test06();
test07();
}