https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114549
Bug ID: 114549 Summary: GCC >= 10.1 selects the wrong overload of C++20 reversed operator== function Product: gcc Version: 10.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: cpeterson at mozilla dot com Target Milestone: --- While updating Firefox from -std=c++17 to -std=c++20, I found a case where GCC's resolution of C++20 reversed operator== functions behaves differently from the Clang, MSVC, and ICX compilers. This is Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=1880776 I believe this difference was a regression in GCC 10.1. Here's a Godbolt test case comparing those compilers' output: https://godbolt.org/z/qneax5oaW ``` #include <type_traits> struct Thing { template <typename T> bool operator==(const T& rhs) const { /* This operator== is selected by: * GCC versions >= 10.1 -std=c++17 * GCC version 9.5 -std=c++2a * Clang 18.1 -std=c++2a * MSVC 19.38 -std=c++20 * Intel's ICX 2024.0.0 -std=c++20 */ return false; } }; template <typename T> bool operator==(T const& lhs, Thing const& rhs) { /* This operator== is selected by: * GCC versions >= 10.1 -std=c++2a */ return true; } bool test() { Thing const v{}; return v == 3; } ```