xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-unused-comparison.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
4*67e74705SXin Li   bool operator==(const A&);
5*67e74705SXin Li   bool operator!=(const A&);
6*67e74705SXin Li   bool operator<(const A&);
7*67e74705SXin Li   bool operator>(const A&);
8*67e74705SXin Li   bool operator<=(const A&);
9*67e74705SXin Li   bool operator>=(const A&);
10*67e74705SXin Li   A operator|=(const A&);
11*67e74705SXin Li   operator bool();
12*67e74705SXin Li };
13*67e74705SXin Li 
test()14*67e74705SXin Li void test() {
15*67e74705SXin Li   int x, *p;
16*67e74705SXin Li   A a, b;
17*67e74705SXin Li 
18*67e74705SXin Li   x == 7; // expected-warning {{equality comparison result unused}} \
19*67e74705SXin Li           // expected-note {{use '=' to turn this equality comparison into an assignment}}
20*67e74705SXin Li   x != 7; // expected-warning {{inequality comparison result unused}} \
21*67e74705SXin Li           // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
22*67e74705SXin Li   x < 7;  // expected-warning {{relational comparison result unused}}
23*67e74705SXin Li   x > 7;  // expected-warning {{relational comparison result unused}}
24*67e74705SXin Li   x <= 7; // expected-warning {{relational comparison result unused}}
25*67e74705SXin Li   x >= 7; // expected-warning {{relational comparison result unused}}
26*67e74705SXin Li 
27*67e74705SXin Li   7 == x; // expected-warning {{equality comparison result unused}}
28*67e74705SXin Li   p == p; // expected-warning {{equality comparison result unused}} \
29*67e74705SXin Li           // expected-note {{use '=' to turn this equality comparison into an assignment}} \
30*67e74705SXin Li           // expected-warning {{self-comparison always evaluates to true}}
31*67e74705SXin Li   a == a; // expected-warning {{equality comparison result unused}} \
32*67e74705SXin Li           // expected-note {{use '=' to turn this equality comparison into an assignment}}
33*67e74705SXin Li   a == b; // expected-warning {{equality comparison result unused}} \
34*67e74705SXin Li           // expected-note {{use '=' to turn this equality comparison into an assignment}}
35*67e74705SXin Li   a != b; // expected-warning {{inequality comparison result unused}} \
36*67e74705SXin Li           // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
37*67e74705SXin Li   a < b;  // expected-warning {{relational comparison result unused}}
38*67e74705SXin Li   a > b;  // expected-warning {{relational comparison result unused}}
39*67e74705SXin Li   a <= b; // expected-warning {{relational comparison result unused}}
40*67e74705SXin Li   a >= b; // expected-warning {{relational comparison result unused}}
41*67e74705SXin Li 
42*67e74705SXin Li   A() == b; // expected-warning {{equality comparison result unused}}
43*67e74705SXin Li   if (42) x == 7; // expected-warning {{equality comparison result unused}} \
44*67e74705SXin Li                   // expected-note {{use '=' to turn this equality comparison into an assignment}}
45*67e74705SXin Li   else if (42) x == 7; // expected-warning {{equality comparison result unused}} \
46*67e74705SXin Li                        // expected-note {{use '=' to turn this equality comparison into an assignment}}
47*67e74705SXin Li   else x == 7; // expected-warning {{equality comparison result unused}} \
48*67e74705SXin Li                // expected-note {{use '=' to turn this equality comparison into an assignment}}
49*67e74705SXin Li   do x == 7; // expected-warning {{equality comparison result unused}} \
50*67e74705SXin Li              // expected-note {{use '=' to turn this equality comparison into an assignment}}
51*67e74705SXin Li   while (false);
52*67e74705SXin Li   while (false) x == 7; // expected-warning {{equality comparison result unused}} \
53*67e74705SXin Li                         // expected-note {{use '=' to turn this equality comparison into an assignment}}
54*67e74705SXin Li   for (x == 7; // expected-warning {{equality comparison result unused}} \
55*67e74705SXin Li                // expected-note {{use '=' to turn this equality comparison into an assignment}}
56*67e74705SXin Li        x == 7; // No warning -- result is used
57*67e74705SXin Li        x == 7) // expected-warning {{equality comparison result unused}} \
58*67e74705SXin Li                // expected-note {{use '=' to turn this equality comparison into an assignment}}
59*67e74705SXin Li     x == 7; // expected-warning {{equality comparison result unused}} \
60*67e74705SXin Li             // expected-note {{use '=' to turn this equality comparison into an assignment}}
61*67e74705SXin Li   switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \
62*67e74705SXin Li                                // expected-note {{use '=' to turn this equality comparison into an assignment}}
63*67e74705SXin Li   switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \
64*67e74705SXin Li                                // expected-note {{use '=' to turn this equality comparison into an assignment}}
65*67e74705SXin Li   switch (42) {
66*67e74705SXin Li     case 1:
67*67e74705SXin Li     case 2:
68*67e74705SXin Li     default:
69*67e74705SXin Li     case 3:
70*67e74705SXin Li     case 4:
71*67e74705SXin Li       x == 7; // expected-warning {{equality comparison result unused}} \
72*67e74705SXin Li               // expected-note {{use '=' to turn this equality comparison into an assignment}}
73*67e74705SXin Li   }
74*67e74705SXin Li 
75*67e74705SXin Li   (void)(x == 7);
76*67e74705SXin Li   (void)(p == p); // expected-warning {{self-comparison always evaluates to true}}
77*67e74705SXin Li   { bool b = x == 7; }
78*67e74705SXin Li 
79*67e74705SXin Li   { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \
80*67e74705SXin Li                         // expected-note {{use '=' to turn this equality comparison into an assignment}}
81*67e74705SXin Li                 x == 7; }); } // no warning on the second, its result is used!
82*67e74705SXin Li 
83*67e74705SXin Li #define EQ(x,y) (x) == (y)
84*67e74705SXin Li   EQ(x, 5);
85*67e74705SXin Li #undef EQ
86*67e74705SXin Li 
87*67e74705SXin Li   (void)sizeof(1 < 2, true); // No warning; unevaluated context.
88*67e74705SXin Li }
89*67e74705SXin Li 
90*67e74705SXin Li namespace PR10291 {
91*67e74705SXin Li   template<typename T>
92*67e74705SXin Li   class X
93*67e74705SXin Li   {
94*67e74705SXin Li   public:
95*67e74705SXin Li 
X()96*67e74705SXin Li     X() : i(0) { }
97*67e74705SXin Li 
foo()98*67e74705SXin Li     void foo()
99*67e74705SXin Li     {
100*67e74705SXin Li       throw
101*67e74705SXin Li         i == 0u ?
102*67e74705SXin Li         5 : 6;
103*67e74705SXin Li     }
104*67e74705SXin Li 
105*67e74705SXin Li   private:
106*67e74705SXin Li     int i;
107*67e74705SXin Li   };
108*67e74705SXin Li 
109*67e74705SXin Li   X<int> x;
110*67e74705SXin Li }
111*67e74705SXin Li 
112*67e74705SXin Li namespace PR19724 {
113*67e74705SXin Li class stream {
114*67e74705SXin Li } cout, cin;
115*67e74705SXin Li 
116*67e74705SXin Li stream &operator<(stream &s, int);
117*67e74705SXin Li bool operator<(stream &s, stream &s2);
118*67e74705SXin Li 
test()119*67e74705SXin Li void test() {
120*67e74705SXin Li   cout < 5;    // no warning, operator returns a reference
121*67e74705SXin Li   cout < cin;  // expected-warning {{relational comparison result unused}}
122*67e74705SXin Li }
123*67e74705SXin Li }
124*67e74705SXin Li 
125*67e74705SXin Li namespace PR19791 {
126*67e74705SXin Li struct S {
127*67e74705SXin Li   void operator!=(int);
128*67e74705SXin Li   int operator==(int);
129*67e74705SXin Li };
130*67e74705SXin Li 
test()131*67e74705SXin Li void test() {
132*67e74705SXin Li   S s;
133*67e74705SXin Li   s != 1;
134*67e74705SXin Li   s == 1;  // expected-warning{{equality comparison result unused}}
135*67e74705SXin Li            // expected-note@-1{{use '=' to turn this equality comparison into an assignment}}
136*67e74705SXin Li }
137*67e74705SXin Li }
138