138 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s2 3struct 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 14void 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 used57 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 EQ86 87 (void)sizeof(1 < 2, true); // No warning; unevaluated context.88}89 90namespace PR10291 {91 template<typename T>92 class X93 {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 112namespace PR19724 {113class stream {114} cout, cin;115 116stream &operator<(stream &s, int);117bool operator<(stream &s, stream &s2);118 119void test() {120 cout < 5; // no warning, operator returns a reference121 cout < cin; // expected-warning {{relational comparison result unused}}122}123}124 125namespace PR19791 {126struct S {127 void operator!=(int);128 int operator==(int);129};130 131void 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