| // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s |
| |
| struct A { |
| bool operator==(const A&); |
| bool operator!=(const A&); |
| bool operator<(const A&); |
| bool operator>(const A&); |
| bool operator<=(const A&); |
| bool operator>=(const A&); |
| A operator|=(const A&); |
| operator bool(); |
| }; |
| |
| void test() { |
| int x, *p; |
| A a, b; |
| |
| x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| x != 7; // expected-warning {{inequality comparison result unused}} \ |
| // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} |
| x < 7; // expected-warning {{relational comparison result unused}} |
| x > 7; // expected-warning {{relational comparison result unused}} |
| x <= 7; // expected-warning {{relational comparison result unused}} |
| x >= 7; // expected-warning {{relational comparison result unused}} |
| |
| 7 == x; // expected-warning {{equality comparison result unused}} |
| p == p; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} \ |
| // expected-warning {{self-comparison always evaluates to true}} |
| a == a; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| a == b; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| a != b; // expected-warning {{inequality comparison result unused}} \ |
| // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} |
| a < b; // expected-warning {{relational comparison result unused}} |
| a > b; // expected-warning {{relational comparison result unused}} |
| a <= b; // expected-warning {{relational comparison result unused}} |
| a >= b; // expected-warning {{relational comparison result unused}} |
| |
| A() == b; // expected-warning {{equality comparison result unused}} |
| if (42) x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| else if (42) x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| else x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| do x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| while (false); |
| while (false) x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| for (x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| x == 7; // No warning -- result is used |
| x == 7) // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| switch (42) { |
| case 1: |
| case 2: |
| default: |
| case 3: |
| case 4: |
| x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| } |
| |
| (void)(x == 7); |
| (void)(p == p); // expected-warning {{self-comparison always evaluates to true}} |
| { bool b = x == 7; } |
| |
| { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \ |
| // expected-note {{use '=' to turn this equality comparison into an assignment}} |
| x == 7; }); } // no warning on the second, its result is used! |
| |
| #define EQ(x,y) (x) == (y) |
| EQ(x, 5); |
| #undef EQ |
| |
| (void)sizeof(1 < 2, true); // No warning; unevaluated context. |
| } |
| |
| namespace PR10291 { |
| template<typename T> |
| class X |
| { |
| public: |
| |
| X() : i(0) { } |
| |
| void foo() |
| { |
| throw |
| i == 0u ? |
| 5 : 6; |
| } |
| |
| private: |
| int i; |
| }; |
| |
| X<int> x; |
| } |
| |
| namespace PR19724 { |
| class stream { |
| } cout, cin; |
| |
| stream &operator<(stream &s, int); |
| bool operator<(stream &s, stream &s2); |
| |
| void test() { |
| cout < 5; // no warning, operator returns a reference |
| cout < cin; // expected-warning {{relational comparison result unused}} |
| } |
| } |
| |
| namespace PR19791 { |
| struct S { |
| void operator!=(int); |
| int operator==(int); |
| }; |
| |
| void test() { |
| S s; |
| s != 1; |
| s == 1; // expected-warning{{equality comparison result unused}} |
| // expected-note@-1{{use '=' to turn this equality comparison into an assignment}} |
| } |
| } |