<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57711>57711</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang C++20 Feature: P2468R2 The Equality Operator You Are Looking For
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++20
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            ilya-biryukov
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          ilya-biryukov
      </td>
    </tr>
</table>

<pre>
    See https://wg21.link/p2468.

Implementing this will remove a major source of ambiguities in Clang for code like:
```
// A pattern, mostly produced by CRTP.
struct Derived;
struct Base {
  bool operator == (const Derived&) const;
  bool operator != (const Derived&) const;
};
struct Derived : Base {};

template <class T>
bool compare(T l, T r)
    requires requires { l == r; } {
  return l == r;
}

void test() {
  Derived() == Derived(); // currently ambiguous with C++20, produces a warning in Clang. 
  compare(Derived(), Derived()); // hard error in Clang (due to SFINAE failure)
}
```

The last error is very common when used with `std::reverse_iterator`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVE1v4jAQ_TXJZVTkOBDIIQcKRaq02q1aLntaOfFAXJyY-oOKf7-ThO-9rGQZZ2Y882beM6WRx-IDEWrv9y5K5xFf0fre8mSkVbuj856Ps9koYsuIzYf9tdlrbLD1qt2Cr5WDb6U1WGzMAUFAIz6NBWeCrRDMBkRTqm1QXqED1cJCC7q3oZDKSAStdtgVHgpk7LSGzx4NzGEvvEfbRnwBjXFeH2FvjQwVSiiPsHhfv50QOm9D5WGJVh1QRunznflZOIRoejIClMZoMHu0whOcKF3SgojPKtO6axKeRTyH3nZJ-M9dnvz33Wi6fAR2CicI8yvIm7Bh90iTF5686aLSwjlYR-nL4OvhVKbZC4uEYg26G9YaLNU_Qwbi6CsoSzxcDlQI9Ll1SwXJsrydkUUfbHsfc-3jBt3BKAkeqVE-65q-yXGZxuAYEt0Z-8ID21WwlsRFHA_CMaETmK9hEfFnWpx1nZ34d6S3b2HbTopnbY3gXPc6j_tidP_BcAugFlYCWku0XuRKcTIgeAMfq9ef8xfYCKVDlzp_HMaDhPt9XZPQBenilNbBAe2xw9eYFr5rbCE44r_vk-46L7s3kc4tUqDDP8oPQiPfKMYiybKUZSyZZbEsUpmnuYi98hqLAe5lVLBC4TucJKy37iW_c-jAvHwFoZU_wq-zgn-bAFQOfhiz66a5MjYOVhf3_wxbAhjKEQGnD60P558n4uMTK-J-pZwL6OgwmU6TJK4LWbHxVE5yLtgsZxkKOS4RM7lJqjIpqyrWokTtimhCmHl1ZZlHk2WsCs44Z3mSspzl42zEOMNpupHjjI1ZJTEaM2yIjVGHY2TsNrZFD6kMW0dOrZx3Vyc9G7VtEU_llD6Kp1LZY9iZw6mkCL42trhzxX1bRd_TXwZNkJs">