1f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s 2ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 3ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruthstruct A { 4ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth bool operator==(const A&); 5ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth bool operator!=(const A&); 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool operator<(const A&); 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool operator>(const A&); 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool operator<=(const A&); 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool operator>=(const A&); 10ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth A operator|=(const A&); 11ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth operator bool(); 12ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth}; 13ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 14ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruthvoid test() { 15ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth int x, *p; 16ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth A a, b; 17ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 18ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth x == 7; // expected-warning {{equality comparison result unused}} \ 19ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 20ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth x != 7; // expected-warning {{inequality comparison result unused}} \ 21ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x < 7; // expected-warning {{relational comparison result unused}} 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x > 7; // expected-warning {{relational comparison result unused}} 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x <= 7; // expected-warning {{relational comparison result unused}} 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x >= 7; // expected-warning {{relational comparison result unused}} 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 27ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 7 == x; // expected-warning {{equality comparison result unused}} 28ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth p == p; // expected-warning {{equality comparison result unused}} \ 29ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} \ 30ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-warning {{self-comparison always evaluates to true}} 319b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth a == a; // expected-warning {{equality comparison result unused}} \ 329b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 339b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth a == b; // expected-warning {{equality comparison result unused}} \ 349b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 359b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth a != b; // expected-warning {{inequality comparison result unused}} \ 369b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}} 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a < b; // expected-warning {{relational comparison result unused}} 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a > b; // expected-warning {{relational comparison result unused}} 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a <= b; // expected-warning {{relational comparison result unused}} 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a >= b; // expected-warning {{relational comparison result unused}} 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 429b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth A() == b; // expected-warning {{equality comparison result unused}} 43ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth if (42) x == 7; // expected-warning {{equality comparison result unused}} \ 44ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 45ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth else if (42) x == 7; // expected-warning {{equality comparison result unused}} \ 46ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 47ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth else x == 7; // expected-warning {{equality comparison result unused}} \ 48ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 49ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth do x == 7; // expected-warning {{equality comparison result unused}} \ 50ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 51ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth while (false); 52ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth while (false) x == 7; // expected-warning {{equality comparison result unused}} \ 53ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 54ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth for (x == 7; // expected-warning {{equality comparison result unused}} \ 55ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 56ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth x == 7; // No warning -- result is used 57ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth x == 7) // expected-warning {{equality comparison result unused}} \ 58ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 59ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth x == 7; // expected-warning {{equality comparison result unused}} \ 60ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 615440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \ 625440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 635440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \ 645440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 65ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth switch (42) { 66ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth case 1: 67ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth case 2: 68ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth default: 69ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth case 3: 70ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth case 4: 715440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth x == 7; // expected-warning {{equality comparison result unused}} \ 725440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 73ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth } 74ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 75ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth (void)(x == 7); 76ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth (void)(p == p); // expected-warning {{self-comparison always evaluates to true}} 77ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth { bool b = x == 7; } 78ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 79ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \ 80ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth // expected-note {{use '=' to turn this equality comparison into an assignment}} 81ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth x == 7; }); } // no warning on the second, its result is used! 82ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth 83ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth#define EQ(x,y) (x) == (y) 84ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth EQ(x, 5); 85ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth#undef EQ 86ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth} 87f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor 88f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregornamespace PR10291 { 89f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor template<typename T> 90f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor class X 91f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor { 92f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor public: 93f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor 94f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor X() : i(0) { } 95f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor 96f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor void foo() 97f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor { 98f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor throw 99f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor i == 0u ? 100f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor 5 : 6; 101f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor } 102f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor 103f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor private: 104f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor int i; 105f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor }; 106f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor 107f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor X<int> x; 108f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor} 1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19724 { 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass stream { 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} cout, cin; 1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstream &operator<(stream &s, int); 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool operator<(stream &s, stream &s2); 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test() { 1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines cout < 5; // no warning, operator returns a reference 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines cout < cin; // expected-warning {{relational comparison result unused}} 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19791 { 1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct S { 1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void operator!=(int); 1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int operator==(int); 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test() { 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S s; 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines s != 1; 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines s == 1; // expected-warning{{equality comparison result unused}} 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-note@-1{{use '=' to turn this equality comparison into an assignment}} 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 136