[libc++] NFCI: Restore code duplication in wrap_iter, with test.
authorArthur O'Dwyer <arthur.j.odwyer@gmail.com>
Wed, 14 Jul 2021 04:01:47 +0000 (00:01 -0400)
committerArthur O'Dwyer <arthur.j.odwyer@gmail.com>
Thu, 15 Jul 2021 00:10:52 +0000 (20:10 -0400)
commit4118858b4e4d072ac2ceef6cbc52088438781f39
tree5e38a8f95589aab2b103e7e71a856d6375c0eab3
parent9cfec72ffeec242783b70e792c50bd163dcf9dbb
[libc++] NFCI: Restore code duplication in wrap_iter, with test.

It turns out that D105040 broke `std::rel_ops`; we actually do need
both a one-template-parameter and a two-template-parameter version of
all the comparison operators, because if we have only the heterogeneous
two-parameter version, then `x > x` is ambiguous:

    template<class T, class U> int f(S<T>, S<U>) { return 1; }
    template<class T> int f(T, T) { return 2; }  // rel_ops
    S<int> s; f(s,s);  // ambiguous between #1 and #2

Adding the one-template-parameter version fixes the ambiguity:

    template<class T, class U> int f(S<T>, S<U>) { return 1; }
    template<class T> int f(T, T) { return 2; }  // rel_ops
    template<class T> int f(S<T>, S<T>) { return 3; }
    S<int> s; f(s,s);  // #3 beats both #1 and #2

We have the same problem with `reverse_iterator` as with `__wrap_iter`.
But so do libstdc++ and Microsoft, so we're not going to worry about it.

Differential Revision: https://reviews.llvm.org/D105894
libcxx/include/__iterator/wrap_iter.h
libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp [new file with mode: 0644]