<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/102588>102588</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
default equality operator== const selects not-const conversion operator
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Fedr
</td>
</tr>
</table>
<pre>
This program
```
struct A {
int i = 0;
constexpr operator int() const { return i; }
constexpr operator int&() { return ++i; }
};
struct B : A {
bool operator==(const B &) const = default;
};
constexpr bool f() {
B x;
return x == x;
}
static_assert( f() ); // fails in Clang
```
is accepted by GCC and MSVC, but fails static assertion in Clang. Online demo: https://gcc.godbolt.org/z/5hYob3K66
Clang looks wrong here, because not-const `operator int&` should not be called from within `B::operator==(const B &) const`.
Related discussion: https://stackoverflow.com/q/78850335/7325599
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVE-P2ygU_zT48jQRBtuxDz7EibyH1Wql3apSTxXGLzYdAhnAyUw_fYXjJplMpVayFAK8378HCO_VYBBrkjck3yViCqN1dYu9Szrbv9WfRuXh6OzgxIHQHaEbUtDlm__64CYZYANk3VxmAACUCaCA8B1Qwu_mpTU-4OvRgT2iE8G6uJWwkrDqshhxwGGYnAFFeANkvft9fbFA3BUT1hDWvIeIg59y3slvgPDNo4nOWn3lIXwXP1ZeVDYwk15F8x30uBeTDjeCD2Q39TP0_iZ6IW3g9V1ci5VXuLDfrd4sLTZEUPKr8B5djPOGzao5AdYS1sJeKO1BGdhqYYZf9lN5EFLiMWAP3Rv8td2CMD388__nLWFb6KawoFwo4UKprLnCruBfo5VB6PFgY6xjCEdP-OYiYpByNdi-szqsrBsIa78T1ubjF9vxv4vi3tUMB9raZw9nZ80AIzqcZaAUk0cwNjwtHSjo45EoKPjRTrqP26BDkEJr7GHv7AHOKozKxLImSuObP2o0KejqXuF_qEVMqldeTt4raz4a9kHIZ3tCt9f2vJL2QFj7Qli7Lsuccp7HIWd5XlVJX_O-4pVIsE7XjKdVlpZZMtYFE1mepj2rRFUVKZN7VrJ9iVlB87TsskTVjLKMlrSiFeU0W63XBVZSClFy3hdyTTKKB6H0SuvTIeaeKO8nrFPK8rJMtOhQ-_kVYMzgGeZVwlh8FFwdi566afAko1r54G8wQQWN9XL2AV8moVV4e7g2yy3xqFEGf9c1ac0JXcztWpFMTtcPR0aFceqW6CLz8vN0dPYbykBYO-v1hLWLoVPNfgQAAP__Uod0BA">