https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107542

--- Comment #2 from danakj at orodu dot net ---
The same thing works okay with operator== instead of operator<=>

https://godbolt.org/z/qnPx3bYT4

```
#include <compare>
#include <concepts>

template <class Lhs, class Rhs>
concept Ord = requires(const Lhs& lhs, const Rhs& rhs) {
    { lhs <=> rhs } -> std::same_as<std::strong_ordering>;
};

template <class Lhs, class Rhs>
concept Eq = requires(const Lhs& lhs, const Rhs& rhs) {
    { lhs == rhs } -> std::same_as<bool>;
};

template <class T>
struct S {
    T* p;
};

template <class T, class U>
    requires(Eq<const T*, const U*>)
bool operator==(const S<T>& l, const S<U>& r) {
    return l.p == r.p;
}

template <class T, class U>
    requires(Ord<const T*, const U*>)
constexpr inline auto operator<=>(const S<T>& l, const S<U>& r) noexcept {
    return l.p <=> r.p;
}

static_assert(Ord<S<int>, S<int>>);  // Works.
// static_assert(!Ord<S<int>, S<S<int>>>);  // ICE.

static_assert(Eq<S<int>, S<int>>);  // Works.
static_assert(!Eq<S<int>, S<char>>);  // Works.
```

Reply via email to