Consider this reduced example taken from StackOverflow (https://stackoverflow.com/questions/45602368/correct-behavior-of-built-in-operator-candidates-of-the-overload-resolution-in-t): struct X { X(int*); }; struct Y { operator double(); }; int operator+(X, int); int main() { int{(int*)0 + Y()}; } gcc compiles it fine. But the built-in operator, operator+(int*, std::ptrdiff_t ) should be a better match and selected by overload resolution and THEN, as a result of CWG 1687, the expression should be considered ill-formed. However, it appears that gcc pre-rejects that overload first and instead picks the provided operator+(). clang does the opposite, preferring the builtin operator and then not rejecting it, so this program fails to compile, but for the wrong reason (due to not being able to convert int* to int).
Confirmed. This was never rejected, so it's not a regression. Looks like the issue resolution is not implemented yet.