mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-05 05:10:33 +08:00
libstdc++: Fix ranges::join_view::_Iterator::operator-> [LWG 3500]
This applies the proposed resolution of LWG 3500, which corrects the return type and constraints of this member function to use the right iterator type. Additionally, a nearby local variable is uglified. libstdc++-v3/ChangeLog: * include/std/ranges (join_view::_Iterator::_M_satisfy): Uglify local variable inner. (join_view::_Iterator::operator->): Use _Inner_iter instead of _Outer_iter in the function signature as per LWG 3500. * testsuite/std/ranges/adaptors/join.cc (test08): Test it.
This commit is contained in:
parent
2f2709e691
commit
d4a788c717
@ -2128,9 +2128,9 @@ namespace views
|
||||
|
||||
for (; _M_outer != ranges::end(_M_parent->_M_base); ++_M_outer)
|
||||
{
|
||||
auto& inner = __update_inner(*_M_outer);
|
||||
_M_inner = ranges::begin(inner);
|
||||
if (_M_inner != ranges::end(inner))
|
||||
auto& __inner = __update_inner(*_M_outer);
|
||||
_M_inner = ranges::begin(__inner);
|
||||
if (_M_inner != ranges::end(__inner))
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2211,10 +2211,12 @@ namespace views
|
||||
operator*() const
|
||||
{ return *_M_inner; }
|
||||
|
||||
constexpr _Outer_iter
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 3500. join_view::iterator::operator->() is bogus
|
||||
constexpr _Inner_iter
|
||||
operator->() const
|
||||
requires __detail::__has_arrow<_Outer_iter>
|
||||
&& copyable<_Outer_iter>
|
||||
requires __detail::__has_arrow<_Inner_iter>
|
||||
&& copyable<_Inner_iter>
|
||||
{ return _M_inner; }
|
||||
|
||||
constexpr _Iterator&
|
||||
|
@ -138,6 +138,17 @@ test07()
|
||||
static_assert( std::same_as<std::ranges::range_value_t<V>, int> );
|
||||
}
|
||||
|
||||
void
|
||||
test08()
|
||||
{
|
||||
// LWG 3500. join_view::iterator::operator->() is bogus
|
||||
struct X { int a; };
|
||||
ranges::single_view<ranges::single_view<X>> s{std::in_place, std::in_place, 5};
|
||||
auto v = s | views::join;
|
||||
auto i = v.begin();
|
||||
VERIFY( i->a == 5 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
@ -148,4 +159,5 @@ main()
|
||||
test05();
|
||||
test06();
|
||||
test07();
|
||||
test08();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user