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