gcc/libstdc++-v3/include/std
Jonathan Wakely 6c2582c040 libstdc++: Fix view adaptors for mixed-const sentinels and iterators (PR 95322)
The bug report is that transform_view's sentinel<false> cannot be
compared to its iterator<true>.  The comparison is supposed to use
operator==(iterator<Const>, sentinel<Const>) after converting
sentinel<false> to sentinel<true>. However, the operator== is a hidden
friend so is not a candidate when comparing iterator<true> with
sentinel<false>. The required conversion would only happen if we'd found
the operator, but we can't find the operator until after the conversion
happens.

A new LWG issue has been reported, but not yet assigned a number.  The
solution suggested by Casey Carter is to make the hidden friends of the
sentinel types work with iterators of any const-ness, so that no
conversions are required.

Patrick Palka observed that join_view has a similar problem and a
similar fix is used for its sentinel.

	PR libstdc++/95322
	* include/std/ranges (transform_view::_Sentinel): Allow hidden
	friends to work with _Iterator<true> and _Iterator<false>.
	(join_view::_Sentinel): Likewise.
	* testsuite/std/ranges/adaptors/95322.cc: New test.
2020-05-27 22:08:15 +01:00
..
algorithm
any
array
atomic
bit
bitset
charconv
chrono
codecvt
complex
concepts
condition_variable
coroutine
deque
execution
filesystem
forward_list
fstream
functional
future
iomanip
ios
iosfwd
iostream
istream
iterator
limits
list
locale
map
memory
memory_resource
mutex
numbers
numeric
optional
ostream
queue
random
ranges
ratio
regex
scoped_allocator
set
shared_mutex
span
sstream
stack
stdexcept
stop_token
streambuf
string
string_view
system_error
thread
tuple
type_traits
typeindex
unordered_map
unordered_set
utility
valarray
variant
vector
version