libstdc++: Fix ambiguous comparisons for iterators in C++20
authorJonathan Wakely <jwakely@redhat.com>
Thu, 9 Dec 2021 22:22:42 +0000 (22:22 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 9 Dec 2021 23:19:03 +0000 (23:19 +0000)
commit2c7fb16b5283cf90c4a7f7470e91e1010ee80fcc
tree6d1c7f042ac1628d654528582fe02310903f4d75
parent9042302ef06dc8484ee188ebd6c4164ba67d347d
libstdc++: Fix ambiguous comparisons for iterators in C++20

Since r11-1571 (c++: Refinements to "more constrained") was changed in
the front end, the following comment from stl_iterator.h stopped being
true:

  // These extra overloads are not needed in C++20, because the ones above
  // are constrained with a requires-clause and so overload resolution will
  // prefer them to greedy unconstrained function templates.

The requires-clause is no longer considered when comparing unrelated
function templates. That means that the constrained operator== specified
in the standard is no longer more constrained than the pathological
comparison operators defined in the testsuite_greedy_ops.h header. This
was causing several tests to FAIL in C++20 mode:

FAIL: 23_containers/deque/types/1.cc (test for excess errors)
FAIL: 23_containers/vector/types/1.cc (test for excess errors)
FAIL: 24_iterators/move_iterator/greedy_ops.cc (test for excess errors)
FAIL: 24_iterators/normal_iterator/greedy_ops.cc (test for excess errors)
FAIL: 24_iterators/reverse_iterator/greedy_ops.cc (test for excess errors)

The solution is to restore some of the non-standard comparison operators
that are more specialized than the greedy operators in the testsuite.

libstdc++-v3/ChangeLog:

* include/bits/stl_iterator.h (operator==, operator<=>): Define
overloads for homogeneous specializations of reverse_iterator,
__normal_iterator and move_iterator.
libstdc++-v3/include/bits/stl_iterator.h