]> git.ipfire.org Git - thirdparty/gcc.git/commit
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>
Tue, 26 Apr 2022 13:11:02 +0000 (14:11 +0100)
commit84c86d3df27c8cabc6397b6ec710b35dfc24c40c
treeceda4a77db9dde20c956e25da49ff42538eb4bd9
parent80d7b24c73e3e8d59e4aabf8715b44b1351a363f
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.

(cherry picked from commit 2c7fb16b5283cf90c4a7f7470e91e1010ee80fcc)
libstdc++-v3/include/bits/stl_iterator.h