llvm/llvm-project

[clang] [C++20] Defaulted `operator==` doesn't lookup in using-directive properly

Open

#97.087 aperta il 28 giu 2024

Vedi su GitHub
 (11 commenti) (0 reazioni) (0 assegnatari)C++ (10.782 fork)batch import
clang:frontendgood first issue

Metriche repository

Star
 (26.378 star)
Metriche merge PR
 (Merge medio 1g 2h) (1000 PR mergiate in 30 g)

Descrizione

https://godbolt.org/z/c8v65nGzc

struct X {};
namespace NS {
    bool operator==(X, X);
}
using namespace NS;
struct Y {
    X x;
    friend bool operator==(Y, Y);
};
bool operator==(Y, Y) = default;
<source>:10:6: error: defaulting this equality comparison operator would delete it after its first declaration
   10 | bool operator==(Y, Y) = default;
      |      ^
<source>:7:7: note: defaulted 'operator==' is implicitly deleted because there is no viable 'operator==' for member 'x'
    7 |     X x;
      |       ^

If it is defaulted in the class it does compile and properly call NS::operator==(X, X): https://godbolt.org/z/M8Msc8T3a
If the function-body is replaced it also compiles: https://godbolt.org/z/19sEre7KW

Guida contributor