Issue 87517
Summary [Clang] Error about use of deleted `operator-` is unnecessarily verbose
Labels enhancement, clang:diagnostics
Assignees
Reporter Sirraide
    This program (https://godbolt.org/z/4z9MKW1xE):
```c++
struct O {
  int operator-(O) = delete;
  operator bool();
};

void operators() {
  O o;
  o - o;
};
```
prints

```
<source>:8:5: error: overload resolution selected deleted operator '-'
    8 |   o - o;
      |   ~ ^ ~
<source>:2:7: note: candidate function has been explicitly deleted
    2 |   int operator-(O) = delete;
      |       ^
<source>:8:5: note: built-in candidate operator-(int, int)
    8 |   o - o;
      |     ^
<source>:8:5: note: built-in candidate operator-(int, float)
<source>:8:5: note: built-in candidate operator-(int, double)
<source>:8:5: note: built-in candidate operator-(int, long double)
<source>:8:5: note: built-in candidate operator-(int, __float128)
<source>:8:5: note: built-in candidate operator-(int, long)
<source>:8:5: note: built-in candidate operator-(int, long long)
<source>:8:5: note: built-in candidate operator-(int, __int128)
<source>:8:5: note: built-in candidate operator-(int, unsigned int)
<source>:8:5: note: built-in candidate operator-(int, unsigned long)
<source>:8:5: note: built-in candidate operator-(int, unsigned long long)
<source>:8:5: note: built-in candidate operator-(int, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(float, int)
<source>:8:5: note: built-in candidate operator-(double, int)
<source>:8:5: note: built-in candidate operator-(long double, int)
<source>:8:5: note: built-in candidate operator-(__float128, int)
<source>:8:5: note: built-in candidate operator-(long, int)
<source>:8:5: note: built-in candidate operator-(long long, int)
<source>:8:5: note: built-in candidate operator-(__int128, int)
<source>:8:5: note: built-in candidate operator-(unsigned int, int)
<source>:8:5: note: built-in candidate operator-(unsigned long, int)
<source>:8:5: note: built-in candidate operator-(unsigned long long, int)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, int)
<source>:8:5: note: built-in candidate operator-(float, float)
<source>:8:5: note: built-in candidate operator-(float, double)
<source>:8:5: note: built-in candidate operator-(float, long double)
<source>:8:5: note: built-in candidate operator-(float, __float128)
<source>:8:5: note: built-in candidate operator-(float, long)
<source>:8:5: note: built-in candidate operator-(float, long long)
<source>:8:5: note: built-in candidate operator-(float, __int128)
<source>:8:5: note: built-in candidate operator-(float, unsigned int)
<source>:8:5: note: built-in candidate operator-(float, unsigned long)
<source>:8:5: note: built-in candidate operator-(float, unsigned long long)
<source>:8:5: note: built-in candidate operator-(float, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(double, float)
<source>:8:5: note: built-in candidate operator-(double, double)
<source>:8:5: note: built-in candidate operator-(double, long double)
<source>:8:5: note: built-in candidate operator-(double, __float128)
<source>:8:5: note: built-in candidate operator-(double, long)
<source>:8:5: note: built-in candidate operator-(double, long long)
<source>:8:5: note: built-in candidate operator-(double, __int128)
<source>:8:5: note: built-in candidate operator-(double, unsigned int)
<source>:8:5: note: built-in candidate operator-(double, unsigned long)
<source>:8:5: note: built-in candidate operator-(double, unsigned long long)
<source>:8:5: note: built-in candidate operator-(double, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(long double, float)
<source>:8:5: note: built-in candidate operator-(long double, double)
<source>:8:5: note: built-in candidate operator-(long double, long double)
<source>:8:5: note: built-in candidate operator-(long double, __float128)
<source>:8:5: note: built-in candidate operator-(long double, long)
<source>:8:5: note: built-in candidate operator-(long double, long long)
<source>:8:5: note: built-in candidate operator-(long double, __int128)
<source>:8:5: note: built-in candidate operator-(long double, unsigned int)
<source>:8:5: note: built-in candidate operator-(long double, unsigned long)
<source>:8:5: note: built-in candidate operator-(long double, unsigned long long)
<source>:8:5: note: built-in candidate operator-(long double, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(__float128, float)
<source>:8:5: note: built-in candidate operator-(__float128, double)
<source>:8:5: note: built-in candidate operator-(__float128, long double)
<source>:8:5: note: built-in candidate operator-(__float128, __float128)
<source>:8:5: note: built-in candidate operator-(__float128, long)
<source>:8:5: note: built-in candidate operator-(__float128, long long)
<source>:8:5: note: built-in candidate operator-(__float128, __int128)
<source>:8:5: note: built-in candidate operator-(__float128, unsigned int)
<source>:8:5: note: built-in candidate operator-(__float128, unsigned long)
<source>:8:5: note: built-in candidate operator-(__float128, unsigned long long)
<source>:8:5: note: built-in candidate operator-(__float128, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(long, float)
<source>:8:5: note: built-in candidate operator-(long, double)
<source>:8:5: note: built-in candidate operator-(long, long double)
<source>:8:5: note: built-in candidate operator-(long, __float128)
<source>:8:5: note: built-in candidate operator-(long, long)
<source>:8:5: note: built-in candidate operator-(long, long long)
<source>:8:5: note: built-in candidate operator-(long, __int128)
<source>:8:5: note: built-in candidate operator-(long, unsigned int)
<source>:8:5: note: built-in candidate operator-(long, unsigned long)
<source>:8:5: note: built-in candidate operator-(long, unsigned long long)
<source>:8:5: note: built-in candidate operator-(long, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(long long, float)
<source>:8:5: note: built-in candidate operator-(long long, double)
<source>:8:5: note: built-in candidate operator-(long long, long double)
<source>:8:5: note: built-in candidate operator-(long long, __float128)
<source>:8:5: note: built-in candidate operator-(long long, long)
<source>:8:5: note: built-in candidate operator-(long long, long long)
<source>:8:5: note: built-in candidate operator-(long long, __int128)
<source>:8:5: note: built-in candidate operator-(long long, unsigned int)
<source>:8:5: note: built-in candidate operator-(long long, unsigned long)
<source>:8:5: note: built-in candidate operator-(long long, unsigned long long)
<source>:8:5: note: built-in candidate operator-(long long, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(__int128, float)
<source>:8:5: note: built-in candidate operator-(__int128, double)
<source>:8:5: note: built-in candidate operator-(__int128, long double)
<source>:8:5: note: built-in candidate operator-(__int128, __float128)
<source>:8:5: note: built-in candidate operator-(__int128, long)
<source>:8:5: note: built-in candidate operator-(__int128, long long)
<source>:8:5: note: built-in candidate operator-(__int128, __int128)
<source>:8:5: note: built-in candidate operator-(__int128, unsigned int)
<source>:8:5: note: built-in candidate operator-(__int128, unsigned long)
<source>:8:5: note: built-in candidate operator-(__int128, unsigned long long)
<source>:8:5: note: built-in candidate operator-(__int128, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(unsigned int, float)
<source>:8:5: note: built-in candidate operator-(unsigned int, double)
<source>:8:5: note: built-in candidate operator-(unsigned int, long double)
<source>:8:5: note: built-in candidate operator-(unsigned int, __float128)
<source>:8:5: note: built-in candidate operator-(unsigned int, long)
<source>:8:5: note: built-in candidate operator-(unsigned int, long long)
<source>:8:5: note: built-in candidate operator-(unsigned int, __int128)
<source>:8:5: note: built-in candidate operator-(unsigned int, unsigned int)
<source>:8:5: note: built-in candidate operator-(unsigned int, unsigned long)
<source>:8:5: note: built-in candidate operator-(unsigned int, unsigned long long)
<source>:8:5: note: built-in candidate operator-(unsigned int, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(unsigned long, float)
<source>:8:5: note: built-in candidate operator-(unsigned long, double)
<source>:8:5: note: built-in candidate operator-(unsigned long, long double)
<source>:8:5: note: built-in candidate operator-(unsigned long, __float128)
<source>:8:5: note: built-in candidate operator-(unsigned long, long)
<source>:8:5: note: built-in candidate operator-(unsigned long, long long)
<source>:8:5: note: built-in candidate operator-(unsigned long, __int128)
<source>:8:5: note: built-in candidate operator-(unsigned long, unsigned int)
<source>:8:5: note: built-in candidate operator-(unsigned long, unsigned long)
<source>:8:5: note: built-in candidate operator-(unsigned long, unsigned long long)
<source>:8:5: note: built-in candidate operator-(unsigned long, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(unsigned long long, float)
<source>:8:5: note: built-in candidate operator-(unsigned long long, double)
<source>:8:5: note: built-in candidate operator-(unsigned long long, long double)
<source>:8:5: note: built-in candidate operator-(unsigned long long, __float128)
<source>:8:5: note: built-in candidate operator-(unsigned long long, long)
<source>:8:5: note: built-in candidate operator-(unsigned long long, long long)
<source>:8:5: note: built-in candidate operator-(unsigned long long, __int128)
<source>:8:5: note: built-in candidate operator-(unsigned long long, unsigned int)
<source>:8:5: note: built-in candidate operator-(unsigned long long, unsigned long)
<source>:8:5: note: built-in candidate operator-(unsigned long long, unsigned long long)
<source>:8:5: note: built-in candidate operator-(unsigned long long, unsigned __int128)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, float)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, double)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, long double)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, __float128)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, long)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, long long)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, __int128)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, unsigned int)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, unsigned long)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, unsigned long long)
<source>:8:5: note: built-in candidate operator-(unsigned __int128, unsigned __int128)
```
which is not wrong, but it’s not ideal either... we should not be printing literally every last builtin operator if overload resolution selected a deleted operator.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to