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 | bool operator<(const A&); |
7 | bool operator>(const A&); |
8 | bool operator<=(const A&); |
9 | bool operator>=(const A&); |
10 | A operator|=(const A&); |
11 | operator bool(); |
12 | }; |
13 | |
14 | void 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}} |
22 | 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 | |
27 | 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}} |
31 | 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}} |
37 | 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 | |
42 | A() == b; // expected-warning {{equality comparison result unused}} |
43 | 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}} |
61 | 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}} |
65 | switch (42) { |
66 | case 1: |
67 | case 2: |
68 | default: |
69 | case 3: |
70 | case 4: |
71 | x == 7; // expected-warning {{equality comparison result unused}} \ |
72 | // expected-note {{use '=' to turn this equality comparison into an assignment}} |
73 | } |
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 |
86 | |
87 | (void)sizeof(1 < 2, true); // No warning; unevaluated context. |
88 | } |
89 | |
90 | namespace 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 | } |
111 | |
112 | namespace PR19724 { |
113 | class stream { |
114 | } cout, cin; |
115 | |
116 | stream &operator<(stream &s, int); |
117 | bool operator<(stream &s, stream &s2); |
118 | |
119 | void test() { |
120 | cout < 5; // no warning, operator returns a reference |
121 | cout < cin; // expected-warning {{relational comparison result unused}} |
122 | } |
123 | } |
124 | |
125 | namespace PR19791 { |
126 | struct S { |
127 | void operator!=(int); |
128 | int operator==(int); |
129 | }; |
130 | |
131 | void 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 | } |
138 | |