[Sema] Change order of displayed overloads in diagnostics
Make it a strict weak order. Fixes #64121. Current implementation uses the definition of ordering from the C++ Standard. The definition provides only a partial order and cannot be used in sorting algorithms. The debug builds of libc++ are capable of detecting that problem and this failure was found when building Clang with libc++ and those extra checks enabled, see #64121. The new ordering is a strict weak order and still pushes most interesting functions to the start of the list. In some cases, it leads to better results, e.g. ``` struct Foo { operator int(); operator const char*(); }; void test() { Foo() - Foo(); } ``` Now produces a list with two most relevant builtin operators at the top, i.e. `operator-(int, int)` and `operator-(const char*, const char*)`. Previously `operator-(const char*, const char*)` was the first element, but `operator-(int, int)` was only the 13th element in the output. This is a consequence of `stable_sort` now being able to compare those two candidates, which are indistinguishable in the semantic partial order despite being two local minimums in their respective comparable subsets. However, new implementation does not take into account some aspects of C++ semantics, e.g. which function template is more specialized. This can also lead to worse ordering sometimes. Reviewed By: #clang-language-wg, aaron.ballman Differential Revision: https://reviews.llvm.org/D159351
Loading
Please sign in to comment