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

Reply via email to