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:
Patrick Palka 2020-11-18 10:23:57 -05:00
parent 2f2709e691
commit d4a788c717
2 changed files with 20 additions and 6 deletions

View File

@ -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&

View File

@ -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();
}