mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-19 21:31:42 +08:00
libstdc++: Apply proposed resolution for LWG 3449 [PR95322]
Now that the frontend bug PR96805 is fixed, we can cleanly apply the proposed resolution for this issue. This slightly deviates from the proposed resolution by declaring _CI a member of take_view instead of take_view::_Sentinel, since it doesn't depend on anything within _Sentinel anymore. libstdc++-v3/ChangeLog: PR libstdc++/95322 * include/std/ranges (take_view::_CI): Define this alias template as per LWG 3449 and remove ... (take_view::_Sentinel::_CI): ... this type alias. (take_view::_Sentinel::operator==): Adjust use of _CI accordingly. Define a second overload that accepts an iterator of the opposite constness as per LWG 3449. (take_while_view::_Sentinel::operator==): Likewise. * testsuite/std/ranges/adaptors/95322.cc: Add tests for LWG 3449.
This commit is contained in:
parent
c840700852
commit
e066821b6f
@ -1662,13 +1662,15 @@ namespace views
|
||||
class take_view : public view_interface<take_view<_Vp>>
|
||||
{
|
||||
private:
|
||||
template<bool _Const>
|
||||
using _CI = counted_iterator<
|
||||
iterator_t<__detail::__maybe_const_t<_Const, _Vp>>>;
|
||||
|
||||
template<bool _Const>
|
||||
struct _Sentinel
|
||||
{
|
||||
private:
|
||||
using _Base = __detail::__maybe_const_t<_Const, _Vp>;
|
||||
using _CI = counted_iterator<iterator_t<_Base>>;
|
||||
|
||||
sentinel_t<_Base> _M_end = sentinel_t<_Base>();
|
||||
|
||||
public:
|
||||
@ -1689,7 +1691,15 @@ namespace views
|
||||
base() const
|
||||
{ return _M_end; }
|
||||
|
||||
friend constexpr bool operator==(const _CI& __y, const _Sentinel& __x)
|
||||
friend constexpr bool
|
||||
operator==(const _CI<_Const>& __y, const _Sentinel& __x)
|
||||
{ return __y.count() == 0 || __y.base() == __x._M_end; }
|
||||
|
||||
template<bool _OtherConst = !_Const,
|
||||
typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
|
||||
requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
|
||||
friend constexpr bool
|
||||
operator==(const _CI<_OtherConst>& __y, const _Sentinel& __x)
|
||||
{ return __y.count() == 0 || __y.base() == __x._M_end; }
|
||||
|
||||
friend _Sentinel<!_Const>;
|
||||
@ -1839,6 +1849,13 @@ namespace views
|
||||
operator==(const iterator_t<_Base>& __x, const _Sentinel& __y)
|
||||
{ return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); }
|
||||
|
||||
template<bool _OtherConst = !_Const,
|
||||
typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
|
||||
requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
|
||||
friend constexpr bool
|
||||
operator==(const iterator_t<_Base2>& __x, const _Sentinel& __y)
|
||||
{ return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); }
|
||||
|
||||
friend _Sentinel<!_Const>;
|
||||
};
|
||||
|
||||
|
@ -26,7 +26,7 @@ using __gnu_test::test_forward_range;
|
||||
void
|
||||
test01()
|
||||
{
|
||||
// PR libstdc++/95322 and LWG 3488
|
||||
// PR libstdc++/95322 and LWG 3448
|
||||
int a[2]{1, 2};
|
||||
test_forward_range<int> v{a};
|
||||
auto view1 = v | std::views::take(2);
|
||||
@ -51,8 +51,34 @@ test02()
|
||||
VERIFY( !eq );
|
||||
}
|
||||
|
||||
void
|
||||
test03()
|
||||
{
|
||||
// LWG 3449, for take_view
|
||||
int a[2]{1, 2};
|
||||
test_forward_range<int> v{a};
|
||||
auto view1 = v | std::views::transform(std::identity{});
|
||||
auto view2 = view1 | std::views::take(2);
|
||||
const bool eq = std::ranges::cbegin(view2) == std::ranges::end(view2);
|
||||
VERIFY( !eq );
|
||||
}
|
||||
|
||||
void
|
||||
test04()
|
||||
{
|
||||
// LWG 3449, for take_while_view
|
||||
int a[2]{1, 2};
|
||||
test_forward_range<int> v{a};
|
||||
auto view1 = v | std::views::transform(std::identity{});
|
||||
auto view2 = view1 | std::views::take_while([] (int i) { return true; });
|
||||
const bool eq = std::ranges::cbegin(view2) == std::ranges::end(view2);
|
||||
VERIFY( !eq );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
test03();
|
||||
test04();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user