// 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 class X { public: X() : i(0) { } void foo() { throw i == 0u ? 5 : 6; } private: int i; }; X 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}} } }