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;
}
```