xref: /llvm-project/clang/test/CXX/class/class.compare/class.compare.secondary/p2.cpp (revision 02bb2beeef3d93360694de29573430f584caafe9)
1 // RUN: %clang_cc1 -std=c++20 -verify %s
2 
3 struct A {
4   bool operator!=(const A&) const = default; // expected-warning {{explicitly defaulted equality comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
5   // expected-note@-1 {{defaulted 'operator!=' is implicitly deleted because there is no viable 'operator==' for 'A'}}
6 };
7 
8 struct A2 {
9   struct E {};
10   E e;
11   bool operator==(const A2&) const = default; // expected-warning {{explicitly defaulted equality comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
12   // expected-note@-2 {{defaulted 'operator==' is implicitly deleted because there is no viable 'operator==' for member 'e'}}
13 };
14 
15 
16 struct Q {};
17 bool operator!=(Q, Q); // expected-note {{defaulted 'operator!=' is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison}}
18 struct B {
19   operator Q() const;
20   bool operator!=(const B&) const = default; // expected-warning {{explicitly defaulted equality comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
21 };
22 
23 struct R {};
24 bool operator==(R, R);
25 struct B2 {
26   operator R() const;
27   bool operator!=(const B2&) const = default; // OK! Converts to use rewritten R comparison.
28 };
29 
30 struct C {
31   operator int() const; // expected-note {{defaulted 'operator!=' is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison}}
32   bool operator!=(const C&) const = default; // expected-warning {{explicitly defaulted equality comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
33 };
34 
35 struct D {
36   bool operator<(const D&) const = default; // expected-warning {{explicitly defaulted relational comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
37   // expected-note@-1 {{defaulted 'operator<' is implicitly deleted because there is no viable three-way comparison function for 'D'}}
38 };
39 
40 bool operator<(Q, Q); // expected-note {{defaulted 'operator<' is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison}}
41 struct E {
42   operator Q() const;
43   bool operator<(const E&) const = default; // expected-warning {{explicitly defaulted relational comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
44 };
45 
46 int operator<=>(R, R);
47 struct E2 {
48   operator R() const;
49   bool operator<(const E2&) const = default;
50 };
51 
52 struct F {
53   operator int() const; // expected-note {{defaulted 'operator<' is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison}}
54   bool operator<(const F&) const = default; // expected-warning {{explicitly defaulted relational comparison operator is implicitly deleted}} expected-note{{replace 'default'}}
55 };
56