This implements p2085, allowing out-of-class defaulting of comparison operators, primarily so they need not be inline, IIUC intent. this was mostly straigh forward, but required reimplementing Sema::CheckExplicitlyDefaultedComparison, as now there's a case where we have no a priori clue as to what class a defaulted comparison may be for. We have to inspect the parameter types to find out. Eg:
class X { ... };
bool operator==(X, X) = default;
Thus reimplemented the parameter type checking, and added 'is this a friend' functionality for the above case.
AFAICT, this is affecting code Richard authored.
I think this might not be correct and we will miss diagnosing a case like:
template <class T> struct A { bool operator==(T const &) const; }; template <class T> bool A<T>::operator==(T const &) const = default; template struct A<int>;