Skip to content

[clang] _BitInt member of struct/class implicitly deletes operator== #82998

@kFo

Description

@kFo

https://godbolt.org/z/134fjse57

struct A
{
    _BitInt(64) a;

    constexpr bool operator==(A const& a) const = default; // implicitly deleted due to _BitInt(64)
};

bool cmp(A a, A b)
{
    return a == b; // error
}
<source>:5:20: warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted]
    5 |     constexpr bool operator==(A const& a) const = default; // implicitly deleted due to _BitInt(64)
      |                    ^
<source>:3:17: note: defaulted 'operator==' is implicitly deleted because implied comparison for member 'a' is ambiguous
    3 |     _BitInt(64) a;
      |                 ^
note: built-in candidate operator(float, float)
note: built-in candidate operator(float, double)
note: built-in candidate operator(float, long double)
note: built-in candidate operator(float, __float128)
note: built-in candidate operator(float, int)
note: built-in candidate operator(float, long)
note: built-in candidate operator(float, long long)
note: built-in candidate operator(float, __int128)
note: built-in candidate operator(float, unsigned int)
note: built-in candidate operator(float, unsigned long)
note: built-in candidate operator(float, unsigned long long)
note: built-in candidate operator(float, unsigned __int128)
note: built-in candidate operator(double, float)
note: built-in candidate operator(double, double)
note: built-in candidate operator(double, long double)
note: built-in candidate operator(double, __float128)
note: built-in candidate operator(double, int)
note: built-in candidate operator(double, long)
note: built-in candidate operator(double, long long)
note: built-in candidate operator(double, __int128)
note: built-in candidate operator(double, unsigned int)
note: built-in candidate operator(double, unsigned long)
note: built-in candidate operator(double, unsigned long long)
note: built-in candidate operator(double, unsigned __int128)
note: built-in candidate operator(long double, float)
note: built-in candidate operator(long double, double)
note: built-in candidate operator(long double, long double)
note: built-in candidate operator(long double, __float128)
note: built-in candidate operator(long double, int)
note: built-in candidate operator(long double, long)
note: built-in candidate operator(long double, long long)
note: built-in candidate operator(long double, __int128)
note: built-in candidate operator(long double, unsigned int)
note: built-in candidate operator(long double, unsigned long)
note: built-in candidate operator(long double, unsigned long long)
note: built-in candidate operator(long double, unsigned __int128)
note: built-in candidate operator(__float128, float)
note: built-in candidate operator(__float128, double)
note: built-in candidate operator(__float128, long double)
note: built-in candidate operator(__float128, __float128)
note: built-in candidate operator(__float128, int)
note: built-in candidate operator(__float128, long)
note: built-in candidate operator(__float128, long long)
note: built-in candidate operator(__float128, __int128)
note: built-in candidate operator(__float128, unsigned int)
note: built-in candidate operator(__float128, unsigned long)
note: built-in candidate operator(__float128, unsigned long long)
note: built-in candidate operator(__float128, unsigned __int128)
note: built-in candidate operator(int, float)
note: built-in candidate operator(int, double)
note: built-in candidate operator(int, long double)
note: built-in candidate operator(int, __float128)
note: built-in candidate operator(int, int)
note: built-in candidate operator(int, long)
note: built-in candidate operator(int, long long)
note: built-in candidate operator(int, __int128)
note: built-in candidate operator(int, unsigned int)
note: built-in candidate operator(int, unsigned long)
note: built-in candidate operator(int, unsigned long long)
note: built-in candidate operator(int, unsigned __int128)
note: built-in candidate operator(long, float)
note: built-in candidate operator(long, double)
note: built-in candidate operator(long, long double)
note: built-in candidate operator(long, __float128)
note: built-in candidate operator(long, int)
note: built-in candidate operator(long, long)
note: built-in candidate operator(long, long long)
note: built-in candidate operator(long, __int128)
note: built-in candidate operator(long, unsigned int)
note: built-in candidate operator(long, unsigned long)
note: built-in candidate operator(long, unsigned long long)
note: built-in candidate operator(long, unsigned __int128)
note: built-in candidate operator(long long, float)
note: built-in candidate operator(long long, double)
note: built-in candidate operator(long long, long double)
note: built-in candidate operator(long long, __float128)
note: built-in candidate operator(long long, int)
note: built-in candidate operator(long long, long)
note: built-in candidate operator(long long, long long)
note: built-in candidate operator(long long, __int128)
note: built-in candidate operator(long long, unsigned int)
note: built-in candidate operator(long long, unsigned long)
note: built-in candidate operator(long long, unsigned long long)
note: built-in candidate operator(long long, unsigned __int128)
note: built-in candidate operator(__int128, float)
note: built-in candidate operator(__int128, double)
note: built-in candidate operator(__int128, long double)
note: built-in candidate operator(__int128, __float128)
note: built-in candidate operator(__int128, int)
note: built-in candidate operator(__int128, long)
note: built-in candidate operator(__int128, long long)
note: built-in candidate operator(__int128, __int128)
note: built-in candidate operator(__int128, unsigned int)
note: built-in candidate operator(__int128, unsigned long)
note: built-in candidate operator(__int128, unsigned long long)
note: built-in candidate operator(__int128, unsigned __int128)
note: built-in candidate operator(unsigned int, float)
note: built-in candidate operator(unsigned int, double)
note: built-in candidate operator(unsigned int, long double)
note: built-in candidate operator(unsigned int, __float128)
note: built-in candidate operator(unsigned int, int)
note: built-in candidate operator(unsigned int, long)
note: built-in candidate operator(unsigned int, long long)
note: built-in candidate operator(unsigned int, __int128)
note: built-in candidate operator(unsigned int, unsigned int)
note: built-in candidate operator(unsigned int, unsigned long)
note: built-in candidate operator(unsigned int, unsigned long long)
note: built-in candidate operator(unsigned int, unsigned __int128)
note: built-in candidate operator(unsigned long, float)
note: built-in candidate operator(unsigned long, double)
note: built-in candidate operator(unsigned long, long double)
note: built-in candidate operator(unsigned long, __float128)
note: built-in candidate operator(unsigned long, int)
note: built-in candidate operator(unsigned long, long)
note: built-in candidate operator(unsigned long, long long)
note: built-in candidate operator(unsigned long, __int128)
note: built-in candidate operator(unsigned long, unsigned int)
note: built-in candidate operator(unsigned long, unsigned long)
note: built-in candidate operator(unsigned long, unsigned long long)
note: built-in candidate operator(unsigned long, unsigned __int128)
note: built-in candidate operator(unsigned long long, float)
note: built-in candidate operator(unsigned long long, double)
note: built-in candidate operator(unsigned long long, long double)
note: built-in candidate operator(unsigned long long, __float128)
note: built-in candidate operator(unsigned long long, int)
note: built-in candidate operator(unsigned long long, long)
note: built-in candidate operator(unsigned long long, long long)
note: built-in candidate operator(unsigned long long, __int128)
note: built-in candidate operator(unsigned long long, unsigned int)
note: built-in candidate operator(unsigned long long, unsigned long)
note: built-in candidate operator(unsigned long long, unsigned long long)
note: built-in candidate operator(unsigned long long, unsigned __int128)
note: built-in candidate operator(unsigned __int128, float)
note: built-in candidate operator(unsigned __int128, double)
note: built-in candidate operator(unsigned __int128, long double)
note: built-in candidate operator(unsigned __int128, __float128)
note: built-in candidate operator(unsigned __int128, int)
note: built-in candidate operator(unsigned __int128, long)
note: built-in candidate operator(unsigned __int128, long long)
note: built-in candidate operator(unsigned __int128, __int128)
note: built-in candidate operator(unsigned __int128, unsigned int)
note: built-in candidate operator(unsigned __int128, unsigned long)
note: built-in candidate operator(unsigned __int128, unsigned long long)
note: built-in candidate operator(unsigned __int128, unsigned __int128)
<source>:5:51: note: replace 'default' with 'delete'
    5 |     constexpr bool operator==(A const& a) const = default; // implicitly deleted due to _BitInt(64)
      |                                                   ^~~~~~~
      |                                                   delete
<source>:10:14: error: object of type 'A' cannot be compared because its 'operator==' is implicitly deleted
   10 |     return a == b; // error
      |              ^
<source>:5:20: note: explicitly defaulted function was implicitly deleted here
    5 |     constexpr bool operator==(A const& a) const = default; // implicitly deleted due to _BitInt(64)
      |                    ^
<source>:3:17: note: defaulted 'operator==' is implicitly deleted because implied comparison for member 'a' is ambiguous
    3 |     _BitInt(64) a;
      |                 ^
note: built-in candidate operator(float, float)
note: built-in candidate operator(float, double)
note: built-in candidate operator(float, long double)
note: built-in candidate operator(float, __float128)
note: built-in candidate operator(float, int)
note: built-in candidate operator(float, long)
note: built-in candidate operator(float, long long)
note: built-in candidate operator(float, __int128)
note: built-in candidate operator(float, unsigned int)
note: built-in candidate operator(float, unsigned long)
note: built-in candidate operator(float, unsigned long long)
note: built-in candidate operator(float, unsigned __int128)
note: built-in candidate operator(double, float)
note: built-in candidate operator(double, double)
note: built-in candidate operator(double, long double)
note: built-in candidate operator(double, __float128)
note: built-in candidate operator(double, int)
note: built-in candidate operator(double, long)
note: built-in candidate operator(double, long long)
note: built-in candidate operator(double, __int128)
note: built-in candidate operator(double, unsigned int)
note: built-in candidate operator(double, unsigned long)
note: built-in candidate operator(double, unsigned long long)
note: built-in candidate operator(double, unsigned __int128)
note: built-in candidate operator(long double, float)
note: built-in candidate operator(long double, double)
note: built-in candidate operator(long double, long double)
note: built-in candidate operator(long double, __float128)
note: built-in candidate operator(long double, int)
note: built-in candidate operator(long double, long)
note: built-in candidate operator(long double, long long)
note: built-in candidate operator(long double, __int128)
note: built-in candidate operator(long double, unsigned int)
note: built-in candidate operator(long double, unsigned long)
note: built-in candidate operator(long double, unsigned long long)
note: built-in candidate operator(long double, unsigned __int128)
note: built-in candidate operator(__float128, float)
note: built-in candidate operator(__float128, double)
note: built-in candidate operator(__float128, long double)
note: built-in candidate operator(__float128, __float128)
note: built-in candidate operator(__float128, int)
note: built-in candidate operator(__float128, long)
note: built-in candidate operator(__float128, long long)
note: built-in candidate operator(__float128, __int128)
note: built-in candidate operator(__float128, unsigned int)
note: built-in candidate operator(__float128, unsigned long)
note: built-in candidate operator(__float128, unsigned long long)
note: built-in candidate operator(__float128, unsigned __int128)
note: built-in candidate operator(int, float)
note: built-in candidate operator(int, double)
note: built-in candidate operator(int, long double)
note: built-in candidate operator(int, __float128)
note: built-in candidate operator(int, int)
note: built-in candidate operator(int, long)
note: built-in candidate operator(int, long long)
note: built-in candidate operator(int, __int128)
note: built-in candidate operator(int, unsigned int)
note: built-in candidate operator(int, unsigned long)
note: built-in candidate operator(int, unsigned long long)
note: built-in candidate operator(int, unsigned __int128)
note: built-in candidate operator(long, float)
note: built-in candidate operator(long, double)
note: built-in candidate operator(long, long double)
note: built-in candidate operator(long, __float128)
note: built-in candidate operator(long, int)
note: built-in candidate operator(long, long)
note: built-in candidate operator(long, long long)
note: built-in candidate operator(long, __int128)
note: built-in candidate operator(long, unsigned int)
note: built-in candidate operator(long, unsigned long)
note: built-in candidate operator(long, unsigned long long)
note: built-in candidate operator(long, unsigned __int128)
note: built-in candidate operator(long long, float)
note: built-in candidate operator(long long, double)
note: built-in candidate operator(long long, long double)
note: built-in candidate operator(long long, __float128)
note: built-in candidate operator(long long, int)
note: built-in candidate operator(long long, long)
note: built-in candidate operator(long long, long long)
note: built-in candidate operator(long long, __int128)
note: built-in candidate operator(long long, unsigned int)
note: built-in candidate operator(long long, unsigned long)
note: built-in candidate operator(long long, unsigned long long)
note: built-in candidate operator(long long, unsigned __int128)
note: built-in candidate operator(__int128, float)
note: built-in candidate operator(__int128, double)
note: built-in candidate operator(__int128, long double)
note: built-in candidate operator(__int128, __float128)
note: built-in candidate operator(__int128, int)
note: built-in candidate operator(__int128, long)
note: built-in candidate operator(__int128, long long)
note: built-in candidate operator(__int128, __int128)
note: built-in candidate operator(__int128, unsigned int)
note: built-in candidate operator(__int128, unsigned long)
note: built-in candidate operator(__int128, unsigned long long)
note: built-in candidate operator(__int128, unsigned __int128)
note: built-in candidate operator(unsigned int, float)
note: built-in candidate operator(unsigned int, double)
note: built-in candidate operator(unsigned int, long double)
note: built-in candidate operator(unsigned int, __float128)
note: built-in candidate operator(unsigned int, int)
note: built-in candidate operator(unsigned int, long)
note: built-in candidate operator(unsigned int, long long)
note: built-in candidate operator(unsigned int, __int128)
note: built-in candidate operator(unsigned int, unsigned int)
note: built-in candidate operator(unsigned int, unsigned long)
note: built-in candidate operator(unsigned int, unsigned long long)
note: built-in candidate operator(unsigned int, unsigned __int128)
note: built-in candidate operator(unsigned long, float)
note: built-in candidate operator(unsigned long, double)
note: built-in candidate operator(unsigned long, long double)
note: built-in candidate operator(unsigned long, __float128)
note: built-in candidate operator(unsigned long, int)
note: built-in candidate operator(unsigned long, long)
note: built-in candidate operator(unsigned long, long long)
note: built-in candidate operator(unsigned long, __int128)
note: built-in candidate operator(unsigned long, unsigned int)
note: built-in candidate operator(unsigned long, unsigned long)
note: built-in candidate operator(unsigned long, unsigned long long)
note: built-in candidate operator(unsigned long, unsigned __int128)
note: built-in candidate operator(unsigned long long, float)
note: built-in candidate operator(unsigned long long, double)
note: built-in candidate operator(unsigned long long, long double)
note: built-in candidate operator(unsigned long long, __float128)
note: built-in candidate operator(unsigned long long, int)
note: built-in candidate operator(unsigned long long, long)
note: built-in candidate operator(unsigned long long, long long)
note: built-in candidate operator(unsigned long long, __int128)
note: built-in candidate operator(unsigned long long, unsigned int)
note: built-in candidate operator(unsigned long long, unsigned long)
note: built-in candidate operator(unsigned long long, unsigned long long)
note: built-in candidate operator(unsigned long long, unsigned __int128)
note: built-in candidate operator(unsigned __int128, float)
note: built-in candidate operator(unsigned __int128, double)
note: built-in candidate operator(unsigned __int128, long double)
note: built-in candidate operator(unsigned __int128, __float128)
note: built-in candidate operator(unsigned __int128, int)
note: built-in candidate operator(unsigned __int128, long)
note: built-in candidate operator(unsigned __int128, long long)
note: built-in candidate operator(unsigned __int128, __int128)
note: built-in candidate operator(unsigned __int128, unsigned int)
note: built-in candidate operator(unsigned __int128, unsigned long)
note: built-in candidate operator(unsigned __int128, unsigned long long)
note: built-in candidate operator(unsigned __int128, unsigned __int128)
1 warning and 1 error generated.
Compiler returned: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    clang:frontendLanguage frontend issues, e.g. anything involving "Sema"confirmedVerified by a second party

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions