libstdc++: Make relational operators work with const guarded iterators (PR 92472)

This is a correct fix for the incorrect cppcheck suggestion to make
these parameters const. In order to that, the dereference operators need
to be const. The conversions to the underlying iterator can be const
too.

	PR c/92472
	* include/parallel/multiway_merge.h (_GuardedIterator::operator*)
	(_GuardedIterator::operator _RAIter, _UnguardedIterator::operator*)
	(_UnguardedIterator::operator _RAIter): Add const qualifier.
	(operator<(_GuardedIterator&, _GuardedIterator&)
	(operator<=(_GuardedIterator&, _GuardedIterator&)
	(operator<(_UnguardedIterator&, _UnguardedIterator&)
	(operator<=(_UnguardedIterator&, _UnguardedIterator&): Change
	parameters to const references.
This commit is contained in:
Jonathan Wakely 2020-05-07 21:43:49 +01:00
parent c710084383
commit 4cbc9d8b34
2 changed files with 24 additions and 12 deletions

View File

@ -27,6 +27,18 @@
* config/abi/post/sparc-solaris/sparcv9/baseline_symbols.txt:
Likewise.
2020-05-07 Jonathan Wakely <jwakely@redhat.com>
PR c/92472
* include/parallel/multiway_merge.h (_GuardedIterator::operator*)
(_GuardedIterator::operator _RAIter, _UnguardedIterator::operator*)
(_UnguardedIterator::operator _RAIter): Add const qualifier.
(operator<(_GuardedIterator&, _GuardedIterator&)
(operator<=(_GuardedIterator&, _GuardedIterator&)
(operator<(_UnguardedIterator&, _UnguardedIterator&)
(operator<=(_UnguardedIterator&, _UnguardedIterator&): Change
parameters to const references.
2020-05-06 Martin Liska <mliska@suse.cz>
Revert:

View File

@ -104,12 +104,12 @@ namespace __gnu_parallel
/** @brief Dereference operator.
* @return Referenced element. */
typename std::iterator_traits<_RAIter>::value_type&
operator*()
operator*() const
{ return *_M_current; }
/** @brief Convert to wrapped iterator.
* @return Wrapped iterator. */
operator _RAIter()
operator _RAIter() const
{ return _M_current; }
/** @brief Compare two elements referenced by guarded iterators.
@ -117,8 +117,8 @@ namespace __gnu_parallel
* @param __bi2 Second iterator.
* @return @c true if less. */
friend bool
operator<(_GuardedIterator<_RAIter, _Compare>& __bi1,
_GuardedIterator<_RAIter, _Compare>& __bi2)
operator<(const _GuardedIterator<_RAIter, _Compare>& __bi1,
const _GuardedIterator<_RAIter, _Compare>& __bi2)
{
if (__bi1._M_current == __bi1._M_end) // __bi1 is sup
return __bi2._M_current == __bi2._M_end; // __bi2 is not sup
@ -132,8 +132,8 @@ namespace __gnu_parallel
* @param __bi2 Second iterator.
* @return @c True if less equal. */
friend bool
operator<=(_GuardedIterator<_RAIter, _Compare>& __bi1,
_GuardedIterator<_RAIter, _Compare>& __bi2)
operator<=(const _GuardedIterator<_RAIter, _Compare>& __bi1,
const _GuardedIterator<_RAIter, _Compare>& __bi2)
{
if (__bi2._M_current == __bi2._M_end) // __bi1 is sup
return __bi1._M_current != __bi1._M_end; // __bi2 is not sup
@ -174,12 +174,12 @@ namespace __gnu_parallel
/** @brief Dereference operator.
* @return Referenced element. */
typename std::iterator_traits<_RAIter>::value_type&
operator*()
operator*() const
{ return *_M_current; }
/** @brief Convert to wrapped iterator.
* @return Wrapped iterator. */
operator _RAIter()
operator _RAIter() const
{ return _M_current; }
/** @brief Compare two elements referenced by unguarded iterators.
@ -187,8 +187,8 @@ namespace __gnu_parallel
* @param __bi2 Second iterator.
* @return @c true if less. */
friend bool
operator<(_UnguardedIterator<_RAIter, _Compare>& __bi1,
_UnguardedIterator<_RAIter, _Compare>& __bi2)
operator<(const _UnguardedIterator<_RAIter, _Compare>& __bi1,
const _UnguardedIterator<_RAIter, _Compare>& __bi2)
{
// Normal compare.
return (__bi1.__comp)(*__bi1, *__bi2);
@ -199,8 +199,8 @@ namespace __gnu_parallel
* @param __bi2 Second iterator.
* @return @c True if less equal. */
friend bool
operator<=(_UnguardedIterator<_RAIter, _Compare>& __bi1,
_UnguardedIterator<_RAIter, _Compare>& __bi2)
operator<=(const _UnguardedIterator<_RAIter, _Compare>& __bi1,
const _UnguardedIterator<_RAIter, _Compare>& __bi2)
{
// Normal compare.
return !(__bi1.__comp)(*__bi2, *__bi1);