blob: a24b5a29a3df578efb5a2c9365b663df0f5eba0a [file] [log] [blame]
Douglas Gregorf8b6e152011-10-10 17:38:18 +00001// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s
Chandler Carruthec8058f2011-08-17 09:34:37 +00002
3struct A {
4 bool operator==(const A&);
5 bool operator!=(const A&);
Stephen Hines651f13c2014-04-23 16:59:28 -07006 bool operator<(const A&);
7 bool operator>(const A&);
8 bool operator<=(const A&);
9 bool operator>=(const A&);
Chandler Carruthec8058f2011-08-17 09:34:37 +000010 A operator|=(const A&);
11 operator bool();
12};
13
14void test() {
15 int x, *p;
16 A a, b;
17
18 x == 7; // expected-warning {{equality comparison result unused}} \
19 // expected-note {{use '=' to turn this equality comparison into an assignment}}
20 x != 7; // expected-warning {{inequality comparison result unused}} \
21 // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
Stephen Hines651f13c2014-04-23 16:59:28 -070022 x < 7; // expected-warning {{relational comparison result unused}}
23 x > 7; // expected-warning {{relational comparison result unused}}
24 x <= 7; // expected-warning {{relational comparison result unused}}
25 x >= 7; // expected-warning {{relational comparison result unused}}
26
Chandler Carruthec8058f2011-08-17 09:34:37 +000027 7 == x; // expected-warning {{equality comparison result unused}}
28 p == p; // expected-warning {{equality comparison result unused}} \
29 // expected-note {{use '=' to turn this equality comparison into an assignment}} \
30 // expected-warning {{self-comparison always evaluates to true}}
Chandler Carruth9b106832011-08-17 09:49:44 +000031 a == a; // expected-warning {{equality comparison result unused}} \
32 // expected-note {{use '=' to turn this equality comparison into an assignment}}
33 a == b; // expected-warning {{equality comparison result unused}} \
34 // expected-note {{use '=' to turn this equality comparison into an assignment}}
35 a != b; // expected-warning {{inequality comparison result unused}} \
36 // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
Stephen Hines651f13c2014-04-23 16:59:28 -070037 a < b; // expected-warning {{relational comparison result unused}}
38 a > b; // expected-warning {{relational comparison result unused}}
39 a <= b; // expected-warning {{relational comparison result unused}}
40 a >= b; // expected-warning {{relational comparison result unused}}
41
Chandler Carruth9b106832011-08-17 09:49:44 +000042 A() == b; // expected-warning {{equality comparison result unused}}
Chandler Carruthec8058f2011-08-17 09:34:37 +000043 if (42) x == 7; // expected-warning {{equality comparison result unused}} \
44 // expected-note {{use '=' to turn this equality comparison into an assignment}}
45 else if (42) x == 7; // expected-warning {{equality comparison result unused}} \
46 // expected-note {{use '=' to turn this equality comparison into an assignment}}
47 else x == 7; // expected-warning {{equality comparison result unused}} \
48 // expected-note {{use '=' to turn this equality comparison into an assignment}}
49 do x == 7; // expected-warning {{equality comparison result unused}} \
50 // expected-note {{use '=' to turn this equality comparison into an assignment}}
51 while (false);
52 while (false) x == 7; // expected-warning {{equality comparison result unused}} \
53 // expected-note {{use '=' to turn this equality comparison into an assignment}}
54 for (x == 7; // expected-warning {{equality comparison result unused}} \
55 // expected-note {{use '=' to turn this equality comparison into an assignment}}
56 x == 7; // No warning -- result is used
57 x == 7) // expected-warning {{equality comparison result unused}} \
58 // expected-note {{use '=' to turn this equality comparison into an assignment}}
59 x == 7; // expected-warning {{equality comparison result unused}} \
60 // expected-note {{use '=' to turn this equality comparison into an assignment}}
Chandler Carruth5440bfa2011-08-18 02:04:29 +000061 switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \
62 // expected-note {{use '=' to turn this equality comparison into an assignment}}
63 switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \
64 // expected-note {{use '=' to turn this equality comparison into an assignment}}
Chandler Carruthec8058f2011-08-17 09:34:37 +000065 switch (42) {
66 case 1:
67 case 2:
68 default:
69 case 3:
70 case 4:
Chandler Carruth5440bfa2011-08-18 02:04:29 +000071 x == 7; // expected-warning {{equality comparison result unused}} \
72 // expected-note {{use '=' to turn this equality comparison into an assignment}}
Chandler Carruthec8058f2011-08-17 09:34:37 +000073 }
74
75 (void)(x == 7);
76 (void)(p == p); // expected-warning {{self-comparison always evaluates to true}}
77 { bool b = x == 7; }
78
79 { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \
80 // expected-note {{use '=' to turn this equality comparison into an assignment}}
81 x == 7; }); } // no warning on the second, its result is used!
82
83#define EQ(x,y) (x) == (y)
84 EQ(x, 5);
85#undef EQ
Stephen Hines176edba2014-12-01 14:53:08 -080086
87 (void)sizeof(1 < 2, true); // No warning; unevaluated context.
Chandler Carruthec8058f2011-08-17 09:34:37 +000088}
Douglas Gregorf8b6e152011-10-10 17:38:18 +000089
90namespace PR10291 {
91 template<typename T>
92 class X
93 {
94 public:
95
96 X() : i(0) { }
97
98 void foo()
99 {
100 throw
101 i == 0u ?
102 5 : 6;
103 }
104
105 private:
106 int i;
107 };
108
109 X<int> x;
110}
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700111
112namespace PR19724 {
113class stream {
114} cout, cin;
115
116stream &operator<(stream &s, int);
117bool operator<(stream &s, stream &s2);
118
119void test() {
120 cout < 5; // no warning, operator returns a reference
121 cout < cin; // expected-warning {{relational comparison result unused}}
122}
123}
124
125namespace PR19791 {
126struct S {
127 void operator!=(int);
128 int operator==(int);
129};
130
131void test() {
132 S s;
133 s != 1;
134 s == 1; // expected-warning{{equality comparison result unused}}
135 // expected-note@-1{{use '=' to turn this equality comparison into an assignment}}
136}
137}