blob: 0153f213ba1fccb50770a6603ad8371eb0f94b7f [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&);
6 A operator|=(const A&);
7 operator bool();
8};
9
10void 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}}
Chandler Carruth9b106832011-08-17 09:49:44 +000022 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}}
Chandler Carruthec8058f2011-08-17 09:34:37 +000029 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}}
Chandler Carruth5440bfa2011-08-18 02:04:29 +000047 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}}
Chandler Carruthec8058f2011-08-17 09:34:37 +000051 switch (42) {
52 case 1:
53 case 2:
54 default:
55 case 3:
56 case 4:
Chandler Carruth5440bfa2011-08-18 02:04:29 +000057 x == 7; // expected-warning {{equality comparison result unused}} \
58 // expected-note {{use '=' to turn this equality comparison into an assignment}}
Chandler Carruthec8058f2011-08-17 09:34:37 +000059 }
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}
Douglas Gregorf8b6e152011-10-10 17:38:18 +000073
74namespace PR10291 {
75 template<typename T>
76 class X
77 {
78 public:
79
80 X() : i(0) { }
81
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}