mirror of git://gcc.gnu.org/git/gcc.git
libstdc++: Implement LWG 3820/3849 changes to cartesian_product_view
The LWG 3820 testcase revealed a bug in _M_advance, which this patch also fixes. libstdc++-v3/ChangeLog: * include/std/ranges (cartesian_product_view::_Iterator::_Iterator): Remove constraint on default constructor as per LWG 3849. (cartesian_product_view::_Iterator::_M_prev): Adjust position of _Nm > 0 test as per LWG 3820. (cartesian_product_view::_Iterator::_M_advance): Perform bounds checking only on sized cartesian products. * testsuite/std/ranges/cartesian_product/1.cc (test08): New test.
This commit is contained in:
parent
065c93b89c
commit
96abc82224
|
@ -8224,7 +8224,7 @@ namespace views::__adaptor
|
||||||
range_reference_t<__maybe_const_t<_Const, _Vs>>...>;
|
range_reference_t<__maybe_const_t<_Const, _Vs>>...>;
|
||||||
using difference_type = decltype(cartesian_product_view::_S_difference_type());
|
using difference_type = decltype(cartesian_product_view::_S_difference_type());
|
||||||
|
|
||||||
_Iterator() requires forward_range<__maybe_const_t<_Const, _First>> = default;
|
_Iterator() = default;
|
||||||
|
|
||||||
constexpr
|
constexpr
|
||||||
_Iterator(_Iterator<!_Const> __i)
|
_Iterator(_Iterator<!_Const> __i)
|
||||||
|
@ -8389,12 +8389,12 @@ namespace views::__adaptor
|
||||||
_M_prev()
|
_M_prev()
|
||||||
{
|
{
|
||||||
auto& __it = std::get<_Nm>(_M_current);
|
auto& __it = std::get<_Nm>(_M_current);
|
||||||
if (__it == ranges::begin(std::get<_Nm>(_M_parent->_M_bases)))
|
if constexpr (_Nm > 0)
|
||||||
{
|
if (__it == ranges::begin(std::get<_Nm>(_M_parent->_M_bases)))
|
||||||
__it = __detail::__cartesian_common_arg_end(std::get<_Nm>(_M_parent->_M_bases));
|
{
|
||||||
if constexpr (_Nm > 0)
|
__it = __detail::__cartesian_common_arg_end(std::get<_Nm>(_M_parent->_M_bases));
|
||||||
_M_prev<_Nm - 1>();
|
_M_prev<_Nm - 1>();
|
||||||
}
|
}
|
||||||
--__it;
|
--__it;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8415,10 +8415,13 @@ namespace views::__adaptor
|
||||||
if constexpr (_Nm == 0)
|
if constexpr (_Nm == 0)
|
||||||
{
|
{
|
||||||
#ifdef _GLIBCXX_ASSERTIONS
|
#ifdef _GLIBCXX_ASSERTIONS
|
||||||
auto __size = ranges::ssize(__r);
|
if constexpr (sized_range<__maybe_const_t<_Const, _First>>)
|
||||||
auto __begin = ranges::begin(__r);
|
{
|
||||||
auto __offset = __it - __begin;
|
auto __size = ranges::ssize(__r);
|
||||||
__glibcxx_assert(__offset + __x >= 0 && __offset + __x <= __size);
|
auto __begin = ranges::begin(__r);
|
||||||
|
auto __offset = __it - __begin;
|
||||||
|
__glibcxx_assert(__offset + __x >= 0 && __offset + __x <= __size);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
__it += __x;
|
__it += __x;
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,6 +201,14 @@ test07()
|
||||||
VERIFY( i == 5 );
|
VERIFY( i == 5 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test08()
|
||||||
|
{
|
||||||
|
// LWG 3820
|
||||||
|
auto r = views::cartesian_product(views::iota(0));
|
||||||
|
r.begin() += 3;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
|
@ -211,4 +219,5 @@ main()
|
||||||
test05();
|
test05();
|
||||||
static_assert(test06());
|
static_assert(test06());
|
||||||
test07();
|
test07();
|
||||||
|
test08();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue