1 // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s
2
3 struct A {
4 bool operator==(const A&);
5 bool operator!=(const A&);
6 A operator|=(const A&);
7 operator bool();
8 };
9
test()10 void test() {
11 int x, *p;
12 A a, b;
13
14 x == 7; // expected-warning {{equality comparison result unused}} \
15 // expected-note {{use '=' to turn this equality comparison into an assignment}}
16 x != 7; // expected-warning {{inequality comparison result unused}} \
17 // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
18 7 == x; // expected-warning {{equality comparison result unused}}
19 p == p; // expected-warning {{equality comparison result unused}} \
20 // expected-note {{use '=' to turn this equality comparison into an assignment}} \
21 // expected-warning {{self-comparison always evaluates to true}}
22 a == a; // expected-warning {{equality comparison result unused}} \
23 // expected-note {{use '=' to turn this equality comparison into an assignment}}
24 a == b; // expected-warning {{equality comparison result unused}} \
25 // expected-note {{use '=' to turn this equality comparison into an assignment}}
26 a != b; // expected-warning {{inequality comparison result unused}} \
27 // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
28 A() == b; // expected-warning {{equality comparison result unused}}
29 if (42) x == 7; // expected-warning {{equality comparison result unused}} \
30 // expected-note {{use '=' to turn this equality comparison into an assignment}}
31 else if (42) x == 7; // expected-warning {{equality comparison result unused}} \
32 // expected-note {{use '=' to turn this equality comparison into an assignment}}
33 else x == 7; // expected-warning {{equality comparison result unused}} \
34 // expected-note {{use '=' to turn this equality comparison into an assignment}}
35 do x == 7; // expected-warning {{equality comparison result unused}} \
36 // expected-note {{use '=' to turn this equality comparison into an assignment}}
37 while (false);
38 while (false) x == 7; // expected-warning {{equality comparison result unused}} \
39 // expected-note {{use '=' to turn this equality comparison into an assignment}}
40 for (x == 7; // expected-warning {{equality comparison result unused}} \
41 // expected-note {{use '=' to turn this equality comparison into an assignment}}
42 x == 7; // No warning -- result is used
43 x == 7) // expected-warning {{equality comparison result unused}} \
44 // expected-note {{use '=' to turn this equality comparison into an assignment}}
45 x == 7; // expected-warning {{equality comparison result unused}} \
46 // expected-note {{use '=' to turn this equality comparison into an assignment}}
47 switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \
48 // expected-note {{use '=' to turn this equality comparison into an assignment}}
49 switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \
50 // expected-note {{use '=' to turn this equality comparison into an assignment}}
51 switch (42) {
52 case 1:
53 case 2:
54 default:
55 case 3:
56 case 4:
57 x == 7; // expected-warning {{equality comparison result unused}} \
58 // expected-note {{use '=' to turn this equality comparison into an assignment}}
59 }
60
61 (void)(x == 7);
62 (void)(p == p); // expected-warning {{self-comparison always evaluates to true}}
63 { bool b = x == 7; }
64
65 { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \
66 // expected-note {{use '=' to turn this equality comparison into an assignment}}
67 x == 7; }); } // no warning on the second, its result is used!
68
69 #define EQ(x,y) (x) == (y)
70 EQ(x, 5);
71 #undef EQ
72 }
73
74 namespace PR10291 {
75 template<typename T>
76 class X
77 {
78 public:
79
X()80 X() : i(0) { }
81
foo()82 void foo()
83 {
84 throw
85 i == 0u ?
86 5 : 6;
87 }
88
89 private:
90 int i;
91 };
92
93 X<int> x;
94 }
95